大整数为数字位数较多的整数,因系统输出范围有限,故用数组储存。
方法一:
将两个大整数分别存储在两个数组中,再将其和存入第三个数组,输出。
代码如下:
include
include
define N 91
int main(void)
{
char s1[N],s2[N];
int s3[N],i,j,k,cp=0,x;//cp作为进位累加器,初始化为0
//获取两个大整数
printf("请输入第一个数字\n");
gets(s1);
printf("请输入第二个数字\n");
gets(s2);
//第一步倒序求和 将i,j,k 分别置于数组有效长度尾部 循环求和
for(i=strlen(s1)-1,j=strlen(s2)-1,k=N-1;i>-1&&j>-1;i--,j--,k--) //初始化ijk
{
x=s1[i]-'0'+s2[j]-'0'+cp;//将字符转化为数字做加法
s3[k]=x%10;//留下个位
cp=x/10;//进上十位
}
if(i>-1) //若第一个大整数比第二个长
for(;i>-1;i--)
{
x=s1[i]-'0'+cp;
cp=x/10;
s3[k--]=x%10;
}
else if(j>-1)//s2长,s1短
for(;j>-1;j--)
{
x=s2[j]-'0'+cp;
cp=x/10;
s3[k--]=x%10;
}
if(cp)//若cp为1;将cp进位加入s3;
s3[k]=cp;
else //当两个数一样长时,避免cp=0时被输出,令k回退一位
k=k+1;
//输出结果
for(;k<N;k++)
printf("%d",s3[k]);
}
因上述代码在处理一长一短的大整数(即横线内部分)时较为复杂,现做优化。
方法二:
定义一个指针变量,默认s1为长数字,若实际s2长,则让指针变量指向s2.具体代码如下:
include
include
define N 91
int main(void)
{
char s1[N],s2[N];//为方便调用strlen函数,定义为字符型数组
int s3[N],i,j,k,x,cp=0;
char *s=s1;//定义指针变量,指向长的数组,方便表示 ;先假设长的字符串是s1
//获取两个大整数
printf(“请输入第一个数字\n”);
gets(s1);
printf(“请输入第二个数字\n”);
gets(s2);
//初始化ijk
i=strlen(s1)-1;
j=strlen(s2)-1;
k=N-1;
while(i>-1&&j>-1)
{
x=s1[i]-‘0’+s2[j]-‘0’+cp;
s3[k]=x%10;
cp=x/10;
i–;
j–;
k–;
}
//若长的字符串是s2, 交换ij,改变指针指向
if(j>-1)
{
i=j;
s=s2;
}
while(i>-1)//加到下标为0为止
{
x=s[i]-‘0’+cp;
s3[k–]=x%10;
cp=x/10;
}
if(cp)//加上最后一位进位
s[k]=cp;
else
k=k+1;
for(;k
include
include
define N 9
int main(void)
{
char s1[N],s2[N];
int s3[N],i,j,k,x,cp=0;
printf(“请输入第一个整数\n”);
gets(s1);
printf(“请输入第二个整数\n”);
gets(s2);
i=strlen(s1)-1;
j=strlen(s2)-1;
k=N-1;
while(i>-1||j>-1)
{
if(i>-1&&j>-1)//两个数组下标都没有减到-1时
x=s1[i--]-'0'+s2[j--]-'0'+cp;
else if (i>-1)//若下组s2坐标已减为-1,s1下标未减为-1
x=s1[i--]-'0'+cp;
else//若数组s1下标已减为-1,s2下标未减为-1
x=s2[j--]-'0'+cp;
s3[k--]=x%10;//存入s3中
cp=x/10;
}
if(cp)//最后一位进位数若不为0,加到数组s3中
s3[k--]=cp;
for(k=k+1;k<N;k++)
printf("%d",s3[k]);//输出
}
以上仅为小白见解,欢迎各位大佬指正赐教。