问题标题: 洛谷:P1601 A+B Problem(高精)

0
0

0
已采纳
李宜和
李宜和
高级启示者
高级启示者

python它不香吗?

printf(a+b);

a,b是变量

0
孙浩轩
孙浩轩
中级守护
中级守护

题目中最有价值的信息莫过于数据范围在10^500,显然是要用高精度计算的。
于是我在知识的海洋中找了又找,发现没有任何数据类型能承受10^500,看来只能用字符串来储存了。
输入后就要看是要用哪种运算方式。
虽然字符串里边全是数字,但我个人认为电脑不支持直接相加QAQ,所以只能用竖式计算(模拟)
哦对了,竖式计算之前要先让这些数字摆脱字符的束缚(-‘0’)
一般情况下,人们列竖式都会把比较长的数字放在上面
然后就进入了振奋人心的竖式计算环节,主要是解决进位问题
竖式计算更新每个数字的值,在这里a数组充当的角色是最终结果
由于直接计算会出现11,12,13等情况,所以a[i]%10就是下一位计算的进位值
进位结束后要记得将每一位去掉进位值
竖式计算解决完后,你长舒了一口气,然后又掉进了另一个坑里。
如果你是“抄人”,那么问你一个简单而有趣的问题,99+1怎么办?
你的计算机会亲切的输出“00”,99+1=0(skr)
于是解决下一个问题------句首进位
如果还要进位的话,在之前+1
在竖式运算结束后,如果变量jw还有值,就把它输出

孙浩轩在2021-11-11 20:47:26追加了内容

@酷町扫地僧 @酷町侠 申精!

0
李宜和
李宜和
高级启示者
高级启示者

C++:

什么情况下要使用高精度

    当两个数超过long longlonglong的大小并且要对这两个大数进行运算的时候。

既然数这么大,我们用什么存放呢?

    用字符串存放。

那怎么运算呢?

    小学学加法的时候,我们是从最低位开始计算,两两相加,逢十进一。

    我们也可以用计算机模拟这一过程。

  • 既然要进行运算,我们总得知道字符串的长度吧?怎么获取呢?
  • a[0]=strlen(s);
    b[0]=strlen(ss);
    strlen函数
  •  
  • 要运算,怎么知道某一位的具体数值是几呢?

这个跟ascllascll码有关了。

一个字符数字的ascllascll码-4848(也就是00的ascllascll码)就是那个数字的ascllascll码。

转化过程:

for(int i=1; i<=a[0]; i++) a[i]=s[a[0]-i]-'0';
for(int i=1; i<=b[0]; i++) b[i]=ss[b[0]-i]-'0';

注意:一定要考虑进位!! 

读入第一行字符串AA与第二行字符串BB,

将两串字符串的每个字符转成数字存储在数组中,字符转数字的方式是:ch-’0’

我们将个位存在a[1]a[1],高位存在a[l]a[l],ll是数字位数,也即字符串长度。

字符串BB也用一个数组bb来记录。

高精度加法就是模拟加法的过程,我们要做的就是让a和b的每一位相加,并判断任意一位数是否大于等于1010,即应进位的问题。

处理完进位同时也要考虑最终和的位数(长度)是否有变化。 最终逐位输出达成输出大数的效果。

好的AC

0
李显晨
李显晨
中级启示者
中级启示者

用数组进行模拟加法,模拟进位。

最后遍历数组输出。

我要回答