对于大数运算的理解,因为类型都有自己的范围,所以对于参加运算的数都有大小限制,让我们从下面的图片中看下int和long long的范围
所以我们要通过数组模拟进位运算
#include<stdio.h>
#include<string.h>
void swap(char**a,char**b)//这里也是关键
{
char* tmp=*a;
*a=*b;
*b=tmp;
}
void swap1(int* alen,int* blen)//要写出类型
{
int tmplen=*alen;
*alen=*blen;
*blen=tmplen;
}
void sum(char*a,char*b,int alen,int blen,char* c)
{
if(alen<blen)//这里加法无所谓是否交换,但是后面的像减法就需要了
{
swap(&a,&b);//交换元素
swap1(&alen,&blen);//交换大小,重点这里需要取地址,否则调用函数后无法改变值,一句话,形参是实参的一份临时拷贝
//为什么不直接写成一个函数呢,因为我的能力可能不够,我觉得renturn只能返回一个值,我现在还无法将这两个函数合并成一个
}
//现在模拟进位运算
int carry=0;//表示进的数
int sum=0;
int i=alen-1;
int j=blen-1;//因为要从个位开始,所以从数组后面开始算
for(; i>=0; --i,--j)
{
sum=(a[i]-'0')+(b[j]-'0')+carry;//这里需要加字符0转换为整型
carry=sum/10;
sum%=10;
c[i]=sum+'0';//这里又需要转换回去储存起来
}
//这里只计算了一部分,还有一部分没有算,如12345+67,这里123部分还要处理
for(; i>=0; --i) //这里i的值是上面的留下的值
{
sum=(a[i]-'0')+carry;
carry=sum/10;
sum%=10;
c[i]=sum+'0';
}
//可能仍需进位
if (carry > 0)
{
for(int k=alen; k>0; --k)
{
c[k]=c[k-1];
}
c[0] =carry +'0';//这个处理很重要,否则会出现99+11=10的情况,最好不要用memmove因为每个编译器对于这个功能的实现可能不同
}
else
{
c[alen]='\0';
}
printf("sum=%s\n",c);
}
int main()
{
char a[500];
char b[500];
char c[1001];
char op;
scanf("%s",a);
getchar();
scanf("%c",&op);
getchar();
scanf("%s",b);
//注意a,b两个字符串不用加&
getchar();
int alen=strlen(a);
int blen=strlen(b);
if(op=='+')
sum(a,b,alen,blen,c);
return 0;
}