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;
}
原文地址:https://www.cnblogs.com/scau20110726/p/2871909.html