当前位置:首页 > NOIP > 正文

信息学一本通 1168:大整数加法

题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555



#include <bits/stdc++.h>
using namespace std;

/*解题思路:int类型数据最多10位,double类型数据最多64位,因此,不能直接利用int或double类型数据相加求解*/
/*应考虑用数组(为方便读入数据,采用字符数组),采用列竖式的思路,对位相加,在考虑进位,最终求解。*/
string A,B;
int a[210],b[210],c[210];


int main(){
    //A,B 存储字符串
    memset(a,0,sizeof(c));
    memset(b,0,sizeof(c));
    memset(c,0,sizeof(c));
    cin>>A>>B;
    //字符串长度
    int lena=A.length();
    int lenb=B.length();
    
    //倒过来存储
    for(int i=1;i<=lena;i++){
        a[i]=A[lena-i]-'0';
    }
    
    for(int i=1;i<=lenb;i++){
        b[i]=B[lenb-i]-'0';
    }
    
    
    int len=max(lena,lenb);
    int i;
    for(i=1;i<=len;i++){
        int tmp=a[i]+b[i]+c[i];  //a[i]+b[i]加上存储的上次加法产生的进位
        c[i+1]=tmp/10;           //除以10取整作为进位
        c[i]=tmp%10;             //除以10取余作为这位的结果
    }
    //看最后一位是否有进位,若有进位,则总长度+1
    if(c[i]!=0){
        len++;
    }
    //去除前导0的情况
    while(c[len]==0&&len>0){
        len--;
    }
    //倒着输出结果
    for(int i=len;i>=1;i--){
        cout<<c[i];
    }
    
    
    
}


更新时间 2019-04-12

有话要说...