id="c_n9"width="1920"height="990"style="position: fixed; top: 0px; left: 0px; z-index: -1; opacity: 0.5;">

个位求和

问题 L: 个位求和【增强版】
题目描述
将一个整数区间内所有整数的个位相加并输出。
输入
输入2个int类型整数m和n(m<=n),m与n之间由空格隔开。
输出
将区间[m,n]内所有整数的个位相加并输出。
样例输入 Copy
1 18
样例输出 Copy
81
提示
新年福利,温馨提示:
1)如果用int类型数据,暴力方法只能过90%的数据。最终可能会显示”答案错误10%“或”时间超限10%“。在OI排名表中可以看出得9分。没有优化思路的,得9分后请立刻转做其它题。
2)如果想过另外10%的数据,请优化方法,且注意如果变量或运算的数据超过int最大值(2147483647),请采用long long定义变量, 变量的scanf和printf 请使用%lld作为格式说明符。
代码:

#include<stdio.h>
#include<math.h>
int main()
{
    long long n,m;
    scanf("%lld %lld",&m,&n);
    long long i=0,sum;
    if(m>=0&&n>=0)
    {
        if(m%10==0)
        {
            if(n<10)
            {
                sum=((m+n)*(n-m+1))/2;
            }
            while(m+10<=n)
            {
                m=m+10;
                i++;
            }
            sum=45*i+(((m%10+n%10)*(n-m+1))/2);
        }
        else
        {
            if(n<10)
            {
                sum=((m+n)*(n-m+1))/2;
            }
            else
            {
                long long mid;
                mid=m;
                while(m%10!=0)
                {
                    m=m+1;
                }
                long long q;
                q=((mid%10+(m-1)%10)*(m-mid))/2;
                while(m+10<=n)
                {
                    m=m+10;
                    i++;
                }
                sum=45*i+(((m%10+n%10)*(n-m+1))/2)+q;
            }
        }
    }
    if(m<0&&n<=0)
    {
        if(n%10==0)
        {
            if(m>-10)
            {
                sum=((m+n)*(n-m+1))/2;
            }
            else
            {
                while(n-10>=m)
                {
                    n=n-10;
                    i++;`在这里插入代码片`
                }
                sum=-45*i+(((m%10+n%10)*(n-m+1))/2);
            }
        }
        else
        {
            if(m>-10)
            {
                sum=((m+n)*(n-m+1))/2;
            }
            else
            {
                long long mid;
                mid=n;
                while(n%10!=0)
                {
                    n=n-1;
                }
                long long k;
                k=((mid%10+(n+1)%10)*(mid-n))/2;
                while(n-10>=m)
                {
                    n=n-10;
                    i++;
                }
                sum=-45*i+(((m%10+n%10)*(n-m+1))/2)+k;
            }
        }
    }
    sum=fabs(sum);
    if(m<0&&n>=0)
    {
        long long sum1,sum2;
        if(n<10)
        {
            sum1=(n*(n+1))/2;
        }
        else if(n%10==0)
        {
            sum1=45*(n/10);
        }
        else
        {
            sum1=45*(n/10)+(n%10*(n%10+1))/2;
        }
        if(m>-10)
        {
            sum2=(m*(1-m))/2;
        }
        else if(m%10==0)
        {
            sum2=45*(m/10);
        }
        else
        {
            sum2=45*(m/10)+(m%10*(1-m%10))/2;
        }
        sum2=fabs(sum2);
        sum=sum1+sum2;
    }
    printf("%lld",sum);
    return 0;
}

有点繁琐。。。还望浏览到的可以提供一些其他简单方法,谢谢。

posted @ 2022-01-29 10:53  hellozmc  阅读(139)  评论(0编辑  收藏  举报