来领悟一下高精度加法吧~

最近做PTA总是可以遇到很大位数的加法,今天又遇到了,😔sad sad

(不过打起精神!我们好好学习一下!)

尝试了longlong都装不下的数字,所以需要用数组进行计算。

基本思路呢,就是把数据一位一位放入数组中,通过加法运算和进位的小运算实现高精度加法,最后通过数组输出;

步骤分析(可以skip这个部分,直接看代码QAQ):

  1. 用字符串先存储两个加数,这样子当然是便于一位一位地获取数字啦。
  2. 将len赋值为两个数据长度中的大者,作为计算的最高位也是最后输出时的最后一位(当然会有所变动哒~)
  3. 将数据倒序存储,因为我们计算时是   从低位开始  对应低位  计算的。顺手就把字符转成数值存储到新的int型数组里吧(记得str-'0')
  4. 另外,值得一提的是,我把数组初始化时都设置为0,这样即使两个数位数不一样,也可以用同一段代码实现加法。也便于最后算最高位时的进位。
  5. 前面都是准备工作,真正的计算很短。
  6. 从低位开始相加,如果结果满十则下一位加一,这一位就加余数;如果不满十,则直接赋值。
  7. 这样听起来很麻烦,但是用  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.(应该可以看懂叭~)
  8. 然后还有一步需要解释,就是如果最高位进位了的话,最后显示的要多一位。(关门,放图!!!!本人语言匮乏,幸好本人有手可以画图)
  9. 最后就是去零和倒序输出了

代码:

#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楠钰子.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序和三三总有一个能跑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值