大整数求和

大整数为数字位数较多的整数,因系统输出范围有限,故用数组储存。
方法一:
将两个大整数分别存储在两个数组中,再将其和存入第三个数组,输出。
代码如下:

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]);//输出 

}
以上仅为小白见解,欢迎各位大佬指正赐教。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值