大整数加法
- 实现任意范围的两个整数的加法( 整数的范围用 int 型的变量无法表示)
- 思路:将两个大整数用字符数组存储,首先分别将字符串反转,以实现末尾对齐。然后按照加法规则相加,得到的数组再次反转即可。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 200
void reverse(char *a) //字符串反转函数
{
int i;
char tmp;
int len=strlen(a);
for(i=0;i<=(len-1)/2;i++)
{
tmp=a[i];
a[i]=a[len-i-1];
a[len-i-1]=tmp;
}
}
void fun_add(char *a,char*b,char* c) //加法函数
{
int i;
int lena=strlen(a);
int lenb=strlen(b);
int lenc;
int flag=0; //flag表示是后一位对前一位的进位值
reverse(a);
reverse(b);
lenc=(lena>lenb?lena:lenb)+1; //n位加n位可能是n+1位
for(i=0;i<lenc;i++)
{
if(i==lenc-1) //先讨论边界条件
if(flag==1)
{
c[i]='1';
c[i+1]='\0';
break;
}else
{
c[i]='\0';
break;
}
if(a[i]+b[i]+flag>'9'+'0')
{
c[i]=a[i]+b[i]-'9'-1+flag;
flag=1;
}
else{
c[i]=a[i]+b[i]-'0'+flag;
flag=0;
}
if(i>lena||i>lenb)
flag=0; //此时不可能有进位
}
reverse(a);
reverse(b);
reverse(c);
}
int main()
{
char a[N];
char b[N];
char c[N];
printf("please input a:");
gets(a);
printf("please input b:");
gets(b);
fun_add(a,b,c);
printf("%s+%s=%s\n",a,b,c);
system("pause");
return 0;
}