uva 10994 Simple Addition
数学题
题意很好懂,就不解释。
这个代码写得不好,主要是自己想复杂了感觉,或者还没有找到最本质的规律,举个例子来说明思路
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; }