本文已参与「新人创作礼」活动,一起开启掘金创作之路。高精度

129 阅读3分钟

Ⅰ整数高精度加法

问题描述:
小A正在学习斐波那契数列,小A想要知道斐波那契数列的第n项。
输入:一行,一个整数n。(n<=100)
输出:一行,一个整数,斐波那契数列的第n项。
输入样例1
99
输出样例1
218922995834555169026

这一题光看样例就发现会超long long,数据范围表简单列一下: 在这里插入图片描述 难道递推?

dp_fib[1]=1;
dp_fib[2]=1;
for(int i=3;i<=n;i++){
	dp_fib[i]=dp_fib[i-1]+dp_fib[i-2];
}cout<<dp_fib[n]<<endl;

所以这样肯定是不可以的! 所以,我们可以在c++里模拟一个竖式来计算结果。

写一下,伪代码
int A[]=a;
int B[]=b;

假设正整数A的长度为n,正整数B的长度为m,那么A+B的长度最大为多少?最小为多少? 答:①max(n, m) + 1; ②max(n, m); 所以还是定位为②好一些,考虑道进位情况。 ①高精度数的读取与存储:使用字符串方式读取,然后转换为整数,逆向存储到整型数组。 在这里插入图片描述②高精度数的加法:通过数组下标模拟两个加数中每一个位上数的加法。 在这里插入图片描述 ③去除前导0后,逆向输出。 在这里插入图片描述 Ⅱ任意进制的高精度加法 X进制高精度计算和十进制的区别: ①如果X>=10,需要在字符串转int数组的时候注意将其转换为10进制数 ②进行取模和除法操作时,使用x进行取模和除法操作。 ③如果X>=10,输出时注意将10进制数转换为相应进制的数。 Ⅲ Fib Fib: 算法一: 将两个大整数的加法的计算写成一个子程序, 循环调用即可 在这里插入图片描述 算法二: ① a数组始终保存f[i-1]的值 b数组始终保存f[i-2]的值 c 数组保存f[i]的值,在循环中计算c数组的结果 ② 将上一步计算结束后a数组的值拷贝给b数组,c数组 值拷贝给a数组,进行下一次循环 在这里插入图片描述 高精度减法

问题描述:
已知大正整数a和b,且a > b。 求a-b的值。

🔑解题 ①如果a[i] < b[i]: 模拟a[i]向a[i+1]借位:a[i+1]--; a[i] += 10; ②模拟减法:c[i] = a[i] – b[i]; 如果a[i+1] == 0, 这样借位是否会出问题? 不会.因为最多借1位,即使a[i+1]被借位后等于-1,因为a>b, a[i+1]还可以向a[i+2]借位。借位后a[i+1]等于9,而b[i+1]最大为9。

①高精度数的读取存储:使用字符串方式读取,然后转成整型数组,为方便计算,进行逆向存储。 ②模拟竖式进行减法:相同位置进行相减,不够减时进行借位 ③去除前导0后,逆向输出。 两个正整数a和b, 且a>b,a的长度为n,b的长度为m,那么c = a-b最长为多少?当然是n 两个正整数a和b,如果判断a和b的大小? (a.size()<b.size())||(a.size()==b.size()&&a<b),那么说明a<b 如果a<b,如何计算a-b的值呢? 交换a和b的值,后计算a-b,结果输出一个负号 在这里插入图片描述 Plus: 计算整数a+b的值,( -10^100 <= a, b <= 10^100); ![在这里插入图片描述](img-blog.csdnimg.cn/800b811503b… 使用字符串读取,abs(x) 只需要将x前的负号去除即可。 定义bool型变量sum记录是否做加法,f记录结果是否是负数 模拟高精度加减法。如果f=true,在结果前输出'-'

高精度乘法

问题描述:
计算非闰年一年有多少个小时。

设整数A的长度为n,正整数B的长度为m,那么A ∗ B的长度最大为多少?最小为多少? A ∗ B的长度最长不超过(n + m), 最短不会低于max(n,m)。 高精度×高精度 第一步:数据的读取和存储: 使用字符串读取大整数,然后将其转换为整型数组后逆序存储。 第二步:模拟乘法运算: 在这里插入图片描述第三步:去除前置的0:在这里插入图片描述 第四步:输出结果: 在这里插入图片描述时间复杂度:O(mn); Multiplication: 累加和的计算:sum = 0; sum = sum + x!;x ∈ [1,n] ; 由于结果会超出long long范围,使用高精度模拟计算乘法和加法。

高精度除法 在这里插入图片描述第一步:数据的读取和存储: 在这里插入图片描述

第二步:模拟除法运算: 在这里插入图片描述

第三步:去除前置的0: 在这里插入图片描述

第四步:输出结果: 在这里插入图片描述 a最大10^10000 ,需要使用高精度存储,b[i]最大10000可以使用低精度存储,高精度÷低精度。

问题:该题牵涉到多次除法,是否每次除法后都需要去除前置0? 除了最后一次除法,其他可以不去除前置0,并不影响最终结果。