因为每种数据类型能容纳数字范围有限,一般用int,大一点还能用long long。
但更大的就要用数组来模拟长整数~
例1 高精度加法
可以用数组的每一位记录那个数字上的每一位。即,可以用n位数组记录n位数字。
再来回顾下竖式加法:
514
+ 495
------
1009
实质就是模拟每一位的加法与进位。同时,必须从低到高处理。代码如下:
#include <iostream>
#include <string>
#include <cstdio>
#define maxn 520
using namespace std;
int a[maxn], b[maxn], c[maxn];
int main()
{
string A, B;
cin >> A >> B;
int len = max(A.length(), B.length());
for(int i = A.length() - 1, j = 1; i >= 0; i--, j++)
a[j] = A[i] - '0';
for(int i = B.length() - 1, j = 1; i >= 0; i--, j++)
b[j] = B[i] - '0';
for(int i = 1; i <= len; i++)
{
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;//模拟进位
c[i] %= 10;
}
if(c[len + 1])//可能导致位数增加
len ++;
for(int i = len; i >= 1; i --)
printf("%d", c[i]);
return 0;
}
homework: 高精度减法
例2 高精度乘法
再来回顾下竖式乘法:
514
x 495
--------
2570
4526
2056
--------
254430
我们可以“一口气处理”所有进位,优化效率。
具体见代码:
#include <cstdio>
#include <string>
#define maxn 5010
using namespace std;
int a[maxn],b[maxn],c[maxn];
int main()
{
string A,B;
cin>>A>>B;
int lena=A.length(),lenb=B.length();
for(int i=lena-1;i>=0;i--) a[lena-i]=A[i]-'0';
for(int i=lenb-1;i>=0;i--) b[lenb-i]=B[i]-'0';
for(int i=1;i<=lena;i++)
for(int j=1;j<=lenb;j++)
c[i+j-1]+=a[i]*b[j];//计算贡献
int len=lena+lenb;//乘积位数不超过两数位数和
for(int i=1;i<=len;i++)
{
c[i+1]+=c[i]/10;//处理进位
c[i]%=10;
}
for(;!c[len];)
len--;//去掉前导零
for(int i=max(1,len);i>=1;i--)
printf("%d",c[i]);
return 0;
}
补:复杂度O(n^2)。也可利用快速博里叶变换的方式加速,优化复杂度。大佬们估计知道。
思考题:
阶乘之和
END
大佬可以补充一下高精度除低精度的吗
nice
灰常nice
很nice
今天时间比较赶,就不写那么多了