最近做PTA总是可以遇到很大位数的加法,今天又遇到了,😔sad sad
(不过打起精神!我们好好学习一下!)
尝试了longlong都装不下的数字,所以需要用数组进行计算。
基本思路呢,就是把数据一位一位放入数组中,通过加法运算和进位的小运算实现高精度加法,最后通过数组输出;
步骤分析(可以skip这个部分,直接看代码QAQ):
- 用字符串先存储两个加数,这样子当然是便于一位一位地获取数字啦。
- 将len赋值为两个数据长度中的大者,作为计算的最高位也是最后输出时的最后一位(当然会有所变动哒~)
- 将数据倒序存储,因为我们计算时是 从低位开始 对应低位 计算的。顺手就把字符转成数值存储到新的int型数组里吧(记得str-'0')
- 另外,值得一提的是,我把数组初始化时都设置为0,这样即使两个数位数不一样,也可以用同一段代码实现加法。也便于最后算最高位时的进位。
- 前面都是准备工作,真正的计算很短。
- 从低位开始相加,如果结果满十则下一位加一,这一位就加余数;如果不满十,则直接赋值。
- 这样听起来很麻烦,但是用 aa[i]=aa[i]+bb[i]; aa[i+1]+=aa[i]/10; aa[i]=aa[i]%10;就可以解决.举个栗子:3/10=0 7%10=7 13/10=1 13%10=3.(应该可以看懂叭~)
- 然后还有一步需要解释,就是如果最高位进位了的话,最后显示的要多一位。
(关门,放图!!!!本人语言匮乏,幸好本人有手可以画图) - 最后就是去零和倒序输出了
代码:
#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
int t;
char a[N]={0},b[N]={0},sum[N]={0};
int aa[N]={0},bb[N]={0};
scanf("%d",&t);//t组数据
for(int w=0;w<t;w++)
{
scanf("%s",a);
scanf("%s",b);//输入时,以字符串形式
int i,la,lb,len;
la=strlen(a);
lb=strlen(b);//将两个字符串的长度赋值给la,lb
//将len赋值为la,lb中大者,作为计算的最高位也是最后输出时的最后一位(当然会有所变动)
len=(la>lb?la:lb);
//将输入的两个字符串倒序 并且 字符转换为数字赋值给aa,bb数组
for(i=la-1;i>=0;i--)
aa[la - i - 1] = a[i] - '0';
for(i=lb-1;i>=0;i--)
bb[lb - i - 1] = b[i] - '0';
//开始计算
for(i=0;i<len;i++)
{
aa[i]=aa[i]+bb[i];
aa[i+1]+=aa[i]/10; //满10则进1,如果未满,相当于下一位加0
aa[i]=aa[i]%10; //如果进位了,就要重新赋值求模;如果没进位,相当于又求和赋值了一遍
}
if (aa[len] != 0)
len++; //全部算完后,如果有进位就多显示一位
while (aa[len - 1] == 0 && len>1)
len--; //去零
printf("Case %d:\n%s + %s = ",w+1,a,b);
for (int i = len - 1 ;i >= 0 ;i--) //倒序输出结果
printf("%d",aa[i]);
if(w!=t-1)
printf("\n\n");
else
printf("\n");//这些是格式,不必纠结
}
}
2021.11.23
SThree楠钰子.