首页 > 代码库 > hdu1047(模拟大数循环相加)

hdu1047(模拟大数循环相加)

题目信息:多个大整数相加求和,(用add函数循环相加)

http://acm.hdu.edu.cn/showproblem.php?pid=1047


AC代码:


/**
 *大数的循环加法,转化为字符串循环相加到字符串为"0"
 *注意s=="0"的情况,输出数据之间有空格
 */
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
string add(string s1,string s2){//字符串模拟大数加法,
    string s;
    int len1,len2;
    len1=s1.size()-1; len2=s2.size()-1;
    int i=0,flag=0;
    while(len1>-1&&len2>-1){
        int sum=flag+(s1[len1--]-‘0‘)+(s2[len2--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    while(len1>-1){
        int sum=flag+(s1[len1--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    while(len2>-1){
        int sum=flag+(s2[len2--]-‘0‘);
        s+=char ((sum)%10+‘0‘);
        flag=sum/10;
    }
    if(flag) s+=char (‘0‘+flag);
    //cout<<s<<endl;
    for(int i=0;i<s.size()/2;i++){
        char c=s[i];
        s[i]=s[s.size()-i-1];
        s[s.size()-i-1]=c;
    }
    return s;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        string s,s1;
        cin>>s;
        if(s=="0"){//只有一个0的情况
            cout<<"0"<<endl;
        }
        else{
            cin>>s1;
            for(int i=1;s1!="0";i++){
                s=add(s,s1);
                cin>>s1;
            }
            //cout<<s<<endl;
            int k;
            for(k=0;k<s.size();k++){
                if(s[k]!=‘0‘) break;
            }
            if(k==s.size()) cout<<"0";//全是0
            for(int i=k;i<s.size();i++){
                cout<<s[i];
            }
            cout<<endl;
        }
        if(t) cout<<endl;//每次输出有一个空格
    }
    return 0;
}


hdu1047(模拟大数循环相加)