大数加法
模拟加法
模拟加法是字符串储存大数,并逐个按照位数相加。
代码
#include<stdio.h>
#include<string.h>
int main()
{ char a1[100],a2[100];
while(scanf("%s%s",&a1,&a2)!=EOF)
{
int b1[100]={0},b2[100]={0},b3[100]={0};
int a,b,c,d,e,i,j;
a=strlen(a1);b=strlen(a2);
for(i=a-1,j=0;i>=0;--i)
{
b1[j]=a1[i]-'0';
j++;
}
for(i=b-1,j=0;i>=0;--i)
{
b2[j]=a2[i]-'0';
j++;
}
if(a>b) { c=a;d=b;}
else { c=b;d=a;}
for(i=0;i<c;++i)
{
if(i<b) {
e=b2[i]+b1[i];
b3[i]+=e%10;
b1[i+1]+=e/10;
}
else{
if(a>b) b3[i]+=b1[i];
else b3[i]+=b2[i];
}
}
if(a==b&&b1[a-1]+b2[a-1]>9) printf("%d %d 1",b1[a-1],b2[a-1]);
for(i=c-1;i>=0;--i)
{
printf("%d",b3[i]);
}
printf("\n");
}
}
方法二:
方法一明显有很多的限制,所以我找了一个老学姐的代码。思路清晰。
#include<stdio.h>
#include<string.h>
void rev(char str[],int len)
{
char t;
for(int i=0; i<len/2;++i){
t=str[i];
str[i]=str[len-i-1];
str[len-i-1]=t;
} //该函数的意思是将一个字符串的顺序颠倒。
}
int main()
{
char a[1000],b[1000],c[1000];
int ai,bi,val,carry;
int len,len1,len2;
scanf("%s %s",&a,&b);
len1=strlen(a);
len2=strlen(b);
len=len1>len2 ? len1 : len2;//当判断语句成立时,将len1赋值给len,不成立时将len2赋值给len
rev(a,len1);
rev(b,len2);
carry=0;
for(int i=0;i<len;++i){
ai=i<len1 ? a[i]-'0' : 0;
bi=i<len2 ? b[i]-'0' : 0;
val=(ai+bi+carry)%10;
carry=(ai+bi+carry)/10;
c[i]=val+'0';
}
if(carry==1) putchar('1');
for(int i=len-1;i>=0;--i){
putchar(c[i]);
}
puts("");
return 0;
}