练习题目 1

 Little Elephant and Interval

Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

The Little Elephant very much loves sums on intervals.

This time he has a pair of integers l and r(l ≤ r). The Little Elephant has to find the number of such integers x(l ≤ x ≤ r), that the first digit of integer x equals the last one (in decimal notation). For example, such numbers as 101, 477474 or 9 will be included in the answer and 47, 253 or 1020 will not.

Help him and count the number of described numbers x for a given pair l and r.

Input

The single line contains a pair of integers l and r(1 ≤ l ≤ r ≤ 1018) — the boundaries of the interval.

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use cin, cout streams or the %I64dspecifier.

Output

On a single line print a single integer — the answer to the problem.

Sample Input

Input

2 47

Output

12

Input

47 1024

Output

98

简单题意:  给你两个数字, 判断两个数字之间有多少个首位与末位相同的数字个数,,范围1 -- 10^18

思路分析:   本来想用字符串,,发现__int64可以存储数字,。。 给出两个数字,先求从(0 -- 小数)的数字个数, 再求(0 -- 大树)的数字个数,然后相减。。
#include<stdio.h>
#include<string.h>
#include<math.h>
__int64 l, r, sum1, sum2;
__int64 a[20];
int lnn[22]; //保存每一位;
int getlen(__int64 n)
{
    int len = 0;
    while(n)
    {
        lnn[len] = n % 10;
        n = n / 10;
        len++;
    }
    return len;
}
//注意一下这里求阶乘,不要用那个pow函数,因为会有误差;
__int64 fac(int    s){
    int i;
    __int64 ans=1;
    for(i = 1; i <= s; i++) ans = ans * 10;
    return ans;
}
//这里是为了求出中间的那个数字;
__int64 getn(int ll,int rr)
{
    int i;
    __int64 j = 1, ans = 0;
    for(i = ll; i <= rr; i++)
    {
        ans += lnn[i] * j;
        j = j * 10;
    }

    return ans;
}

int main()
{
    int i, j, k;
    int len1 = 0,len2 = 0;
    scanf("%I64d%I64d", &l,&r);
    a[1] = 10; a[2] = 9;
    a[3] = 90;
    for(i = 4; i <= 18; i++) a[i] = a[i - 1] * 10;
    sum1 = sum2 = 0;
    len2 = getlen(r);
    //要单独讨论长度只有1的情况;
    if(len2 == 1)
        sum2 += r + 1;
    for(i = 1; i < len2; i++)
        sum2 += a[i];
    __int64 s2 = fac(len2 - 1);
    __int64 ans = 0;
     if(r / s2 > 1 && len2 != 1)
     {
         sum2 += a[len2] / 9 * (r / s2 - 1);
     }
     sum2 += getn(1, len2 - 2);
     //这里是首位小于等于末尾的情况,那么要加1;
     if(r / s2 <= r % 10 && len2 != 1)
        sum2++;

     memset(lnn, 0, sizeof(lnn));
     len1 = getlen(l - 1);
     if(len1 == 1)
        sum1 += l;
     for(i = 1;i < len1; i++)
        sum1 += a[i];
     __int64 s1 = fac(len1 - 1);
     if((l - 1) / s1 > 1 && len1 != 1)
     {
         sum1 += a[len1] / 9 * ((l - 1) / s1 - 1);
     }
    sum1 += getn(1, len1 - 2);
    if((l - 1) / s1 <= (l - 1) % 10 && len1 != 1)
        sum1++;

     printf("%I64d\n",sum2 - sum1);
}
时间: 2024-08-27 20:08:08

练习题目 1的相关文章

四则运算题目生成程序

a.需求分析 看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习.练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 =

四则运算题目生成程序(基于控制台)

题目描述: 能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 功能设计: 1.  通过随机数的生成,实现+, ?, ×, ÷的确定 2.  +, ?, ×, ÷分别赋予整

记一次坑die(误)的题目--HDU2553--(DFS)

,N皇后问题   Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 720 Accepted Submission(s): 417 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合

九度oj 题目1552:座位问题

题目描述: 计算机学院的男生和女生共n个人要坐成一排玩游戏,因为计算机的女生都非常害羞,男生又很主动,所以活动的组织者要求在任何时候,一个女生的左边或者右边至少有一个女生,即每个女生均不会只与男生相邻.现在活动的组织者想知道,共有多少种可选的座位方案. 例如当n为4时,共有 女女女女, 女女女男, 男女女女, 女女男男, 男女女男, 男男女女, 男男男男7种. 输入: 输入包含多组测试用例,每组测试用例仅包含一个整数n(1<=n<=1000). 输出: 对于每组测试用例,输出一个数代表可选的方

201301 JAVA题目0-1级

题目描述 编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 输入描述: 第一行是数据个数,第二行是输入的数据 输出描述: 返回true或者false 输入例子: 4 1 5 -5 1 输出例子: true 1 import java.util.*; 2 3 public class Main46 { 4 public

九度oj 题目1499:项目安排

题目描述: 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的.由于小明马上就要硕士毕业了,面临着买房.买车.给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包.万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项目之间不能有时间重叠,但是一个项目刚结束,就可以立即做另一个项目,即项目起止时间点可以重叠). 输

题目1124:Digital Roots (方法超简单)

题目1124:Digital Roots 学到的新知识 求一个数各个的和可以把其%9就行,例如13%9=4 11%9=2:123%9=6: 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3819 解决:1335 题目描述: The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then

上机题目(初级)-高次方数的尾数(Java)

题目如下: 代码如下: package huawei; public final class Demo { /* 功能: 求解M的N次方的最后三位数(M,N均大于10) 输入参数: int M:M > 10 int N:N > 10 返回值: M的N次方的最后三位数 */ public static int getLast3DigitsOfMN(int M, int N) { int result = 1; for(int i = 0;i < N;++i){ result = (resu

算法学习 并查集(笔试题目:找同伙)

题目背景太长,记得不清楚,暂参考<啊哈算法>一书,根据笔试题目大意改编如下: 警察正要捉获某地区的犯罪团伙,由于强盗人数过大,想查清楚有几个团伙非常困难. 根据上级指示,需要首先尽快抓获强盗A所在的团伙,这需要掌握 1 所在团伙的人数.先有资料如下: 强盗1 和 强盗2 是同伙 强盗3 和 强盗4 是同伙 强盗2 和 强盗5 是同伙 强盗3 和 强盗2 是同伙 注意,强盗的同伙的同伙也是同伙,问  强盗1 的同伙(不包括1自己)有多少人? 该题形式化表示如下: 每个测试实例首先包括2个整数:N

题目1191:矩阵最大值

题目描述: 编写一个程序输入一个mXn的矩阵存储并输出,并且求出每行的最大值和每行的总和. 要求把每行总和放入每行最大值的位置,如果有多个最大值,取下标值最小的那一个作为最大值. 最后将结果矩阵输出. 输入: 输入的第一行包括两个整数m和n(1<=m,n<=100),分别代表矩阵的行和列的维数. 接下来的m行每行有n个数,代表矩阵的元素. 输出: 可能有多组测试数据,对于每组数据,输出按题目要求执行后的矩阵. 样例输入: 3 3 1 1 1 1 1 1 1 1 1 3 3 3 2 3 2 3