hdoj1047 Integer Inquiry(大整数的相加)

来源:互联网 发布:道衍和尚 知乎 编辑:程序博客网 时间:2024/05/22 22:39

思路很简单,但感觉我做复杂了(┬_┬)

其实可以直接写一个两个大整数相加的函数,输入一个大整数就加一次。而我直接就输入所有数据,然后对全部数据一起处理,不仅耗费内存还耗费时间。

我的代码:

#include<stdio.h> #include<string>using namespace std;char a[105][105];int b[200];void change(char str[][105],int len,int k)//逆置字符串 {int i,j;char c;i=0;j=len-1;while(j>i){c=str[k][i];str[k][i]=str[k][j];str[k][j]=c;i++;j--;}}int main(){int t,len,max,k;scanf("%d",&t);while(t--){    max=-1;memset(a,'0',sizeof(a));memset(b,0,sizeof(b));int i=0;while(scanf("%s",a[i])&&a[i][0]!='0'){i++;}for(int j=0;j<i;j++)//逆置字符串,并记录最长的字符串长度 {len=strlen(a[j]);change(a,len,j);a[j][len]='0';if(max<len){max=len;k=j;}}for(int m=0;m<max;m++)for(int j=0;j<i;j++)//各位相加保存到对应数组b中 {b[m]+=a[j][m]-'0';}int r=0;int temp;for(int j=0;j<max;j++)//进位处理,使每个单元只保存一个个位数 {temp=r+b[j];b[j]=temp%10;r=temp/10;}while(r)//进位处理 {b[max++]=r%10;r=r/10;}for(int j=max-1;j>0;j--)printf("%d",b[j]);printf("%d\n",b[0]);if(t>0)printf("\n");//格式! }return 0;}

更简易的做法http://www.cnblogs.com/kuangbin/archive/2012/08/13/2635653.html

#include<stdio.h>#include<string>#include<iostream>using namespace std;//高精度加法//只能是两个正数相加string add(string str1,string str2)//高精度加法{    string str;    int len1=str1.length();    int len2=str2.length();    //前面补0,弄成长度相同    if(len1<len2)    {        for(int i=1;i<=len2-len1;i++)           str1="0"+str1;    }    else    {        for(int i=1;i<=len1-len2;i++)           str2="0"+str2;    }    len1=str1.length();    int cf=0;    int temp;    for(int i=len1-1;i>=0;i--)    {        temp=str1[i]-'0'+str2[i]-'0'+cf;        cf=temp/10;        temp%=10;        str=char(temp+'0')+str;    }    if(cf!=0)  str=char(cf+'0')+str;    return str;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        string sum="0";        string str1;        while(cin>>str1)        {            if(str1=="0")break;            sum=add(sum,str1);        }        cout<<sum<<endl;        if(T>0)cout<<endl;    }    return 0;}


原创粉丝点击