【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的加法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
- 第一行是超长正整数A;
- 第二行是超长正整数B;
【输出形式】
输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。
算法提示:
1.用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字符。
2.以较短的超长整数为基准,从低位到高位,对应位转换成数字后相加,再加上前一位相加的进位,得到的和模上10再转换为字符即为当前位,得到的和整除10即为当前位的进位。将计算得到的每一位保存到结果字符数组。
3.将较长字符串的剩余位加上最后一个进位移到结构数组后面。
4.将结果数组反序输出(去掉高位多余的0)。
【输入样例】
134098703578230056
234098
【输出样例】
134098703578464154
【样例说明】
进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。
【评分标准】
完全正确得20分,每个测试点4分,提交程序文件名为add.c。
- 自做真题
//2020/3/31
#include<stdio.h>
#include<string.h>
void fun(char str_max[],char str_min[])
{
int i,j;
int len_max = strlen(str_max);
int len_min = strlen(str_min);
int c,t;
c = 0;
for(i = len_min - 1,j = len_max - 1;i>=0;i--,j--)
{
t = str_min[i] - '0' + str_max[j] - '0' + c;
c = t/10;
t = t%10;
str_max[j] = t + '0';
}
if(c==0)//最后c==0
{
printf("%s\n",str_max);
}
if(c==1)//c==1
{
if(j == -1)//长度相同
{
printf("%d",c);
printf("%s",str_max);
}
else//长度不同
{
while(c && j != -1)
{
t = str_max[j]-'0' + c;
c = t/10;
t = t%10;
str_max[j--] = t + '0';
}
if(c==0)
printf("%s\n",str_max);
else
{
printf("%d",c);
printf("%s\n",str_max);
}
}
}
}
int main()
{
char num1[100],num2[100];
char tmp1[100],tmp2[100];
scanf("%s%s",num1,num2);
int i = 0;
int len = 0;
int ci = 0;
i = 0;
ci = 0;
len = strlen(num1);
while(num1[i] == '0') i++;
for(;i<len;i++)
tmp1[ci++] = num1[i];
tmp1[ci] = '\0';
i = 0;
ci = 0;
len = strlen(num2);
while(num2[i] == '0') i++;
for(;i<len;i++)
tmp2[ci++] = num2[i];
tmp2[ci] = '\0';
if(strlen(tmp1) > strlen(tmp2))
fun(tmp1,tmp2);
else
fun(tmp2,tmp1);
return 0;
}