1.高精度算法
大数运算的实质就是用数组代替变量进行竖式运算
个位 十位 百位
a[1] a[2] a[3]
b[1] b[2] b[3]
c[1] c[2] c[3]
1.1高精度加法
- c[1] += a[1]+b[1];//求和
- c[2] +=c[1]/10;//进位
- c[1] %= 10;//更新数位
1.2高精度减法
- 保证a>b 否则交换
- 若同为相减小于0,则数位+10,高位-1
- 同数位作差
1.3高精度乘法
- b的每个数位都要乘一遍a,双for遍历a,b
- 每当b的数位往前+1,保存乘积的c下标应当相应的+1
- 求和
- 进位
- 更新
乘法例题
示例代码
#include<bits/stdc++.h>
using namespace std;
string A,B;
int a[100005],b[100005],c[100005];
int la,lb,lc;
int main()
{
cin >> A >> B;//因子
la=A.length();lb=B.length();
reverse(A.begin(),A.end());
reverse(B.begin(),B.end());
for(int i=1;i<=la;i++){
a[i] = A[i-1]-'0';
}
for(int i=1;i<=lb;i++){
b[i] = B[i-1]-'0';
}
for(int i=1;i<=la;i++){//模拟竖式运算
for(int j=1;j<=lb;j++){
c[i-1+j] += b[j]*a[i];
c[i+j] += c[i+j-1]/10;
c[i+j-1] %= 10;
}
}
lc = la+lb;
while(!c[lc] && lc>1){//消去前导0
lc--;
}
for(int i=lc;i>=1;i--){//输出
cout << c[i];
}
return 0;
}
1.4高精度进制转换
- 判断是否是数字(高进制出现字母)
- 将字母转换成对应数 如:B-65+10
- 改变进位规则
- 注意输出时大于9的数换成字母输出
例题
示例代码
#include<bits/stdc++.h>
using namespace std;
int b,t[20000],k[20000],res[20000];
int main()
{
string x,y;
cin >> b >> x >>y;
int len = max(x.length(),y.length());
reverse(x.begin(),x.end());
reverse(y.begin(),y.end());
for(int i=0;i<x.length();i++){
if(!isdigit(x[i])){
t[i] += x[i] - 65 +10;
}else{
t[i] = x[i] - '0';
}
}
for(int i=0;i<y.length();i++){
if(!isdigit(y[i])){
k[i] = y[i] - 65 +10;
}else{
k[i] = y[i] - '0';
}
}
for(int i=0;i<len;i++){
res[i] += (t[i] + k[i]);
res[i+1] = res[i]/b;
res[i] %= b;
}
int i=len;
while(1){
if(res[i]||i==0){
break;
}
i--;
}
for(int j=i;j>=0;j--){
if(res[j]<=9)
cout << res[j];
else{
cout << char(res[j]-10+65);
}
}
return 0;
}