问题
【问题描述】编写程序实现两个超长正整数(每个最长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);
}