九度 1373

来源:互联网 发布:mac换行按键 编辑:程序博客网 时间:2024/05/17 04:47

题目来源:http://ac.jobdu.com/problem.php?pid=1373

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:1271

解决:310

题目描述:

亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他。问题是:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有110111213因此共出现6,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

输入:

输入有多组数据,每组测试数据为一行。

每一行有两个整数a,b(0<=a,b<=1,000,000,000)

输出:

对应每个测试案例,输出ab之间1出现的次数。

样例输入:
0 51 1321 5531 99
样例输出:
1647

查找一个数以内1出现的次数可参考:

http://blog.csdn.net/hearthougan/article/details/21645859

#include <iostream>#include <cstring>#include <cstdio>using namespace std;typedef long long LL;LL fabs(LL a){    LL i = a >> 31;    return i == 0 ? a : (~a + 1);}void Swap_Num(LL &a, LL &b){    if(a > b)    {        a = a ^ b;        b = a ^ b;        a = a ^ b;    }    return ;}LL CountOnes(LL n, LL kcount){    LL higernum, lowernum, curnum;    LL factor = 1;    while(n/factor)    {        higernum = n / (factor * 10);        lowernum = n - (n/factor) * factor;        curnum = (n/factor) % 10;        switch( curnum )        {        case 0:            kcount += higernum * factor;            break;        case 1:            kcount += higernum * factor + lowernum + 1;            break;        default:            kcount += higernum * factor + factor;        }        factor *= 10;    }    return kcount;}LL Find_One(LL num, LL tmp){    while(num)    {        if(num%10 == 1)            tmp++;        num /= 10;    }    return tmp;}int main(){    LL a, b;    LL ans1, ans2;    while(~scanf("%lld %lld", &a, &b))    {        Swap_Num(a, b);        ans1 = CountOnes( a, 0 );        ans2 = CountOnes( b, 0 );        int tmp = Find_One(a, 0);        int num = fabs(ans2 - ans1) + tmp;        printf("%lld\n", num);    }    return 0;}



0 0