zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    机器学习-识别手写数字0-9
    tensorflow深度学习-mnist数据集读入-初试
    TensorFlow 2.0 最基础的线性回归
    cuDNN 环境变量-默认安装路径
    INT104-lab2
    [蓝桥杯][历届试题][dfs][割点]危险系数
    2021-03-19:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的最大子矩形,内部有多少个1。
    2021-03-17:手写代码:单链表插入排序。
    2021-03-16:手写代码:单链表归并排序。
    2021-03-15:手写代码:单链表选择排序。
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2871909.html
Copyright © 2011-2022 走看看