超长正整数加法

问题

【问题描述】编写程序实现两个超长正整数(每个最长80位数字)的加法运算。
【输入形式】
从键盘读入两个整数,不考虑输入高位可能为0的情况。
1、 第一行是超长正整数A;
2、第二行是超长正整数B;

【输出形式】 输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。

【输入样例】 134098703578230056234098
【输出样例】 134098703578464154
【样例说明】 进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。

算法分析

如何读入和存储超长整数?
方法一:用字符串方式来读入和存储超长整数

char intstr[81];
scanf("%s", intstr);

方法二:用整数数组来存储超长整数,用字符方式依次读入超长整数的每位数字

int lint[80];
char d,i=0;
while((d=getchar())!= '\n')
    lint[i++] = d – '0';

在程序中数组是从左至右方式存储的,而整数相加是从右至左(从低位到高位),同时由于被加数长短不一,造成计算和转换非常不方便。一种解决方法是整数相加前将两个整数位串首尾颠倒,与计算机存储方式一致。

无论以什么方式存储超长整数,每位相加结果和进位计算方式为:
dighti = (digit1i + digit2i + carry) % 10 (carry为上一次计算产生的进位)
carry = (digit1i + digit2i + carry) / 10 (得到新的进位)

注意
1、若以字符串方式存储超长整数,则在计算每位加和进位时,应考虑数字字符和整数数字之间的转换。
2、特殊情况:
当较短整数最后一位加完后仍有进位情况,如123456789+678;
当较长整数最后一位处理完后仍有进位情况,如9999999+1;

算法实现

/* 主函数 */
#include <stdio.h>
#include <string.h>
#define LENGTH  81
void reverse(char s[])
{
	int i,j,c;;
	for(i=0,j=strlen(s)-1; i<j; i++,j--){
		c = s[i];
		s[i] = s[j];
		s[j] = c;
	}
}
void addLInt(char s1[], char s2[]);
int main()
{
    char intstr1[LENGTH],intstr2[LENGTH];
    scanf("%s %s",intstr1, intstr2);
    addLInt(intstr1, intstr2);
    printf("%s", intstr1);
    return 0;
}
void addLInt(char s1[], char s2[])
{
	int i=0,tmp,c=0;
	char s[LENGTH];
	if(strlen(s1) < strlen(s2)){
		strcpy(s, s1);
		strcpy(s1,s2);
		strcpy(s2,s);
	}
	reverse(s1); reverse(s2);
	while(s2[i] != '\0'){
		tmp = s1[i]-'0' + s2[i]-'0' + c;
		s1[i] = tmp%10 + '0';
		c = tmp/10;
		i++;
	}
	while(s1[i] != '\0' && c){
		tmp = s1[i]-'0' + c;
		s1[i] = tmp%10 + '0';
		c = tmp/10;
		i++;
	}
	if(c){ 
		s1[i++] = c + '0';
		s1[i] = '\0';
	}
	reverse(s1);
}

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不死鸟JGC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值