栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

最近做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
#include
#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;wlb?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;i1)
        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("nn");
       else
           printf("n");//这些是格式,不必纠结
    }
}
    
   

2021.11.23

SThree楠钰子.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/587733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号