您的位置:首页 > 其它

uva 10994 Simple Addition

2013-01-22 18:32 260 查看
数学题

题意很好懂,就不解释。

这个代码写得不好,主要是自己想复杂了感觉,或者还没有找到最本质的规律,举个例子来说明思路

23 ,45678

1. 处理为30 ,45670 ,另外的部分就单独计算得到是78,接着就是(45670-30)/10*45=205380

2.变为3 ,4567,处理为10,4560,另外的部分单独计算为70,接着就是(4560-10)/10*45=20475

3.变为1,456,处理为10,450,另外的部分单独计算为66,接着就是(450-10)/10*45=1980

4.变为1,45,处理为10,40,另外的部分单独计算为60,接着就是(40-10)/10*45=135

5.变为1,4,直接计算得到10

然后全部计算的和记起来就是 78+205380+70+20475+66+1980+60+135+10=228254

另外一个就是负数的问题,其实负数和它的相反数(也就是绝对值)的F(n)刚好互成相反数,也就是相加得0,所以其实有负数区域的话要先转化为正数来处理,其实就是消掉一段,这样其实区间更小了

感觉这样分析好挫,写出来的代码也很烂,但是自己没有再去细想和优化,有空还是再想想其本质,反正和进位是有关的,一个周期就是45,至于详细怎么处理就要思考才知道了

#include <cstdio>
#include <cstring>

int main()
{
long long  p,q;
while(scanf("%lld%lld",&p,&q)!=EOF && !(p<0 && q<0))
{
long long ans,c;
ans=0; c=1;
if(p+q==0)
{
printf("0\n");
continue;
}
if(p<0)
{
if(p+q<0)
{
long long t=-p;
p=q+1;   q=t;  c=-1;
}
else
p=-p+1;
}

while(q-p>=10)
{
long long t1,t2,t3;
//printf("预处理前p=%lld  q=%lld\n",p,q);
t1=t2=t3=0;
if(p!=0 && p%10)
{
while(p%10)
{
t1+=(p%10);
p++;
}
}
if(q%10)
{
while(q%10)
{
t2+=(q%10);
q--;
}
}
//printf("预处理后p=%lld q=%lld\n",p,q);
t3=(q-p)/10*45;
ans+=(t1+t2+t3);
p/=10; q/=10;
//printf("t1=%lld t2=%lld t3=%lld  ans=%lld\n",t1,t2,t3,ans);
}

//printf("最后的处理p=%lld  q=%lld\n",p,q);
long long tmp;
tmp=0;
while(p<=q)
{
if(p!=0 && p%10==0)
{
long long t=p;
while(t%10==0)
t/=10;
tmp+=t%10;
}
else
tmp+=p%10;
p++;
}
//printf("处理结果tmp=%lld\n",tmp);
ans+=tmp;
ans*=c;
printf("%lld\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: