zoukankan      html  css  js  c++  java
  • 中石油-【高精度】简单高精度加法

    问题 B: 【高精度】简单高精度加法

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 63  解决: 20
    [提交][状态][讨论版]

    题目描述

    修罗王解决了计算机的内存限制问题,终于可以使用电脑进行大型的魔法运算了,他交给邪狼的第一个任务是计算两个非负整数A、B的和,其中A和B的位数在5000位以内。

    输入

    共两行数据,第一行为一个非负整数A,第二行为一个非负整数B,A、B的位数均在5000以内。

    输出

    输出一个非负数,即两数之和。

    样例输入

    1111111111
    2222222222
    

    样例输出

    3333333333

    解题思路:两个数位数不同,我这种方法计算的时候需要考虑谁的位数多,也要注意最高位前面预留一进位位。总是觉得自己的算法太复杂,所以容易出错,导致浪费很多时间。这个题记得之前在网上看多一个算法,不用考虑位数多少,回头百度一下。。。好困。。睡觉!

    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    char a[5001]={'0'};
    char b[5001]={'0'};
    int c[5001]={0};
    
    
    int main()
    {
        int g,s;
        scanf("%s",&a[1]);
        scanf("%s",&b[1]);
        int la=strlen(a);
        int lb=strlen(b);
        if(la<lb){
            for(int i=la-1,j=lb-1,k=lb-1;i>0&&j>0;i--,j--,k--){
                c[k]+=(int)(a[i]-'0')+(int)(b[j]-'0');
                if(c[k]>=10){
                    g=c[k]%10;
                    s=c[k]/10;
                    c[k]=g;
                    c[k-1]+=s;
                }
            }
            for(int i=lb-la;i>=0;i--){
                c[i]+=(int)(b[i]-'0');
                if(c[i]>=10){
                    g=c[i]%10;
                    s=c[i]/10;
                    c[i]=g;
                    c[i-1]+=s;
                }
            }
        }
        if(la>lb){
            for(int i=lb-1,j=la-1,k=la-1;i>0&&j>0;i--,j--,k--){
                c[k]+=(int)(b[i]-'0')+(int)(a[j]-'0');
                if(c[k]>=10){
                    g=c[k]%10;
                    s=c[k]/10;
                    c[k]=g;
                    c[k-1]+=s;
                }
            }
            for(int i=la-lb;i>=0;i--){
                c[i]+=(int)(a[i]-'0');
                if(c[i]>=10){
                    g=c[i]%10;
                    s=c[i]/10;
                    c[i]=g;
                    c[i-1]+=s;
                }
            }
        }
        if(la==lb){
            for(int i=lb-1,j=la-1;i>0&&j>0;i--,j--){
                c[i]+=(int)(b[i]-'0')+(int)(a[j]-'0');
                if(c[i]>=10){
                    g=c[i]%10;
                    s=c[i]/10;
                    c[i]=g;
                    c[i-1]+=s;
                }
            }
        }
        int l=la>=lb ? la:lb;
        if(c[0]!=0){
            for(int i=0;i<l;i++){
                printf("%d",c[i]);
            }
        }else{
            for(int i=1;i<l;i++){
                printf("%d",c[i]);
            }
        }
    
        return 0;
    }
    View Code

  • 相关阅读:
    gulp之压缩合并MD5清空替换加前缀以及自动编译自动刷新浏览器大全
    HTML5之文件API
    Angular2之路由学习笔记
    nodejs之主机不能访问到虚拟机的web服务器
    学习CSS3动画(animation)
    jQuery之ajax错误调试分析
    Angular2之管道学习笔记
    css3之3D魔方动画(小白版)
    关于二维网格导入autodyn的问题
    两个橡胶球自由落体撞击弹性板
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5665105.html
Copyright © 2011-2022 走看看