个位求和
问题 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;
}
有点繁琐。。。还望浏览到的可以提供一些其他简单方法,谢谢。