思路很简单,但感觉我做复杂了(┬_┬)
其实可以直接写一个两个大整数相加的函数,输入一个大整数就加一次。而我直接就输入所有数据,然后对全部数据一起处理,不仅耗费内存还耗费时间。
我的代码:
#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;
}
本文对比两种实现大整数加法的方法:一种是通过字符数组处理每一位数的加法及进位;另一种则是利用字符串类型简化操作。后者更加简洁高效,避免了不必要的内存和时间消耗。
346

被折叠的 条评论
为什么被折叠?



