Ⅰ整数高精度加法
问题描述:
小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);
 只需要将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,并不影响最终结果。