c语言中int,unsigned,long long int等类型有取值范围,超过范围的大数无法直接相加,因为会有部分数据丢失,因此我们可以使用数组的形式,依次相加,最后在打印出即可。x
下面以这一题为例
使用字符串数组能够一位一位的相加
因此数组x,y 表示两个数,z用来表示相加后的数
有题目可知相加时从数组的高位开始相加,因为存储时可以正序存储在逆序打印
详细代码如下
int main()
{
char x[max],y[max],z[max];
int n1,n2;
gets(x);
gets(y);
n1=strlen(x)-1;//访问数组时,下标比元素少1,因此减1
n2=strlen(y)-1;
int n,d,k,i;/使用d表示进1
while(n1>=0&&n2>=0)//两个数组都含有数时相加
{
k=x[n1]-'0'+y[n2]-'0'+d;
z[n]=k%10;//只需要存储k的余数
d=k/10;//k大于10则进1
n++;n1--;n2--;
}
while(n1>=0)//只有一个数组有数时
{
k=x[n1]-'0'+d;
z[n]=k%10;
d=k/10;
n++;n1--;
}
while(n2>=0)
{
k=y[n2]-'0'+d;
z[n]=k%10;
d=k/10;
n++;n2--;
}
if(d>0)//两个数组都加完后可能还含有进1位,可以根据d判断,若进1则由于n++,数组z[n]还有一位来存储
z[n]=d;
else//不进1,直接n--即可
n--;
for(i=n;i>=0;i--)
printf("%d",z[i]);
return 0;
}
数组相加时有部分重复,代码可以进一步优化
#include<stdio.h>
#include<string.h>
#define max 1100
int main()
{
char x[max],y[max],z[max];
int n1,n2;
gets(x);
gets(y);
n1=strlen(x)-1;
n2=strlen(y)-1;
int n,d,a,b,k,i;
while(n1>=0||n2>=0)//使用a,b分别存储数组x,y的数,若数组没有数直接赋值位0即可
{
if(n1>=0) a=x[n1]-'0';else a=0;
if(n2>=0) b=y[n2]-'0';else b=0;
k=a+b+d;
z[n]=k%10;
d=k/10;
n++;n1--;n2--;
}
if(d>0)
z[n]=d;
else
n--;
for(i=n;i>=0;i--)
printf("%d",z[i]);
return 0;
}
#include<stdio.h>
#include<string.h>
#define max 1100
上面一个代码少了头文件,抱歉!!!