作业帮 > 综合 > 作业

C++ 输入格式:二个正整数 a b ( 1 ≤ a ≤ b ≤ 2100000000 ) 输出格式:一个数,表

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/07/08 09:00:06
C++ 输入格式:二个正整数 a b ( 1 ≤ a ≤ b ≤ 2100000000 ) 输出格式:一个数,表
区间数字相加
输入格式:二个正整数 a b ( 1 ≤ a ≤ b ≤ 2100000000 )输出格式:一个数,表示区间 [a,b] 上各数的各位上数字累加和输入样例:998 1002输出样例:59样例说明:共有 998、999、1000、1001、1002 五个数     (9+9+8)+(9+9+9)+(1+0+0+0)+(1+0+0+1)+(1+0+0+2) = 59
C++ 输入格式:二个正整数 a b ( 1 ≤ a ≤ b ≤ 2100000000 ) 输出格式:一个数,表
这是一道ACM的编程题吧,发给你一份参考参考吧,希望对你有帮助,此份已AC.#include<cstdio>
#include<cstring>
long long num[10];
long long NUM[10];
void S1(int value)
{
    int a=value;
    int weight=1,left=value/10,right=a%weight;
    int S=value%10;
    value/=10;
    while(value!=0)
    {
        for(int k=0; k<=9; k++)
        {
            if(k==0)
            {
                if(S==0) num[0]+=(left-1)*weight+right+1;
                else if(S>0) num[0]+=left*weight;
            }
            else
            {
                if(S>k)
                    num[k]+=(left+1)*weight;
                else if(S==k)
                    num[k]+=left*weight+right+1;
                else if(S<k)
                    num[k]+=left*weight;
            }
        }
        weight*=10;
        left=value/10;
        right=a%weight;
        S=value%10;
        value/=10;
    }
    //最高位
    for(int k=0; k<=9; k++)
    {
        if(k==0)
        {
            if(S==0) num[0]+=(left-1)*weight+right+1;
            else if(S>0) num[0]+=left*weight;
        }
        else
        {
            if(S>k)
                num[k]+=(left+1)*weight;
            else if(S==k)
                num[k]+=left*weight+right+1;
            else if(S<k)
                num[k]+=left*weight;
        }
    }
    return ;
}
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF && a && b)
    {
        memset(num,0,sizeof(num));
        memset(NUM,0,sizeof(NUM));
        if(a>b)
        {
            int temp=a;
            a=b;
            b=temp;
        }
        S1(a-1);
        for(int i=0; i<10; i++)
            NUM[i]=num[i];
        memset(num,0,sizeof(num));
        S1(b);
        for(int i=0; i<10; i++)
            printf("%lld%c",num[i]-NUM[i],i==9?'\n':' ');
    }
    return 0;
以上代码求出的就是[A,B]之间0-9每个数出现的次数.按照你的要求只需要对num[i] - NUM[i]的差值求和就是了.也就是把74-75行改为一下代码:long long sum = 0;
for(int i=0; i<10; i++)
    sum += num[i]-NUM[i];
printf("%lld\n", sum); //输出的值就是题目的要求.