高精度运算 高精度算法是一种模拟算法
由于操作的对象为很大的数 我们可以使用字符串 字符串在C++有三种定义方式:
char a[100];
char *b;
string c;
对于string, 我们可以到oi-wiki进行查询
高精度算法的本质是竖式运算 为了使运算简单,我们使用vector vector的定义为:
vector<type> a; 对于vector, 我们可以到oi-wiki进行查询
通过以上的算法基础,我们可以列出一个大纲
使用字符数组存储数字 将字符数组转换成整型数组 循环相加,以位数最多者的位数作为次数 处理进位 判断最后的进位是否舍弃,并逆序输出 以下为本蒟蒻的高精度计算代码 加法
#include <bits/stdc++.h>
using namespace std;
int n1[100000],
n2[100000],
n3[100000];
int l1, l2, l3;
string nn1, nn2;
int main() {
cin >> nn1 >> nn2;
l1 = nn1.length();
l2 = nn2.length();
l3 = max(l1, l2);
for(int i=0; i<l1; i++)
n1[l1-i-1] = nn1[i]-'0';
for(int i=0; i<l2; i++)
n2[l2-i-1] = nn2[i]-'0';
for(int i=0; i<l3; i++) {
if(n3[i]+n2[i]+n1[i] > 9) {
n3[i] += n1[i]+n2[i]-10;
n3[i+1] ++;
}else{
n3[i] += n1[i]+n2[i];
}
}
if(n3[l3]) l3++;
for(int i=l3-1; i>=0; i--)
cout << n3[i];
return 0;
}
减法
#include <bits/stdc++.h>
using namespace std;
int n1[100000],
n2[100000],
n3[100000];
int l1, l2;
string nn1, nn2;
int main() {
cin >> nn1 >> nn2;
l1 = nn1.length();
l2 = nn2.length();
if(l1<l2 || (l1==l2 && nn1<nn2)) {
cout << "-";
swap(l1, l2);
swap(nn1, nn2);
}
for(int i=0; i<l1; i++)
n1[l1-i-1] = nn1[i]-'0';
for(int i=0; i<l2; i++)
n2[l2-i-1] = nn2[i]-'0';
int i;
for(i=0; i<l1; i++) {
n3[i] = n1[i]-n2[i];
if(n3[i] < 0) {
n3[i]+=10;
n1[i+1]--;
}
}
while(n3[i]==0 && i>0) i--;
for(; i>=0; i--)
cout << n3[i];
return 0;
}
乘法
#include<iostream>
#include<string>
using namespace std;
string nn1, nn2;
int n1[100000],
n2[100000],
n3[100000];
int l1, l2, l3;
int main () {
cin>>nn1>>nn2;
l1=nn1.length();
l2=nn2.length();
l3=l1+l2;
for(int i=1; i<=l1; i++)
n1[i]=nn1[l1-i]-'0';
for(int i=1; i<=l2; i++)
n2[i]=nn2[l2-i]-'0';
for(int i=1; i<=l2; i++)
for(int j=1; j<=l1; j++)
n3[i+j-1]+=n1[j]*n2[i];
for(int i=1; i<l3; i++)
if(n3[i]>9) {
n3[i+1]+=n3[i]/10;
n3[i]%=10;
}
while(n3[l3]==0&&l3>1) l3--;
for(int i=l3; i>=1; i--) cout<<n3[i];
return 0;
}
除法
#include <bits/stdc++.h>
using namespace std;
string x;
long long b;
long len, last = 0, y = 0;
int a[10000000], res[10000000];
int main() {
cin >> x >> b;
len = x.length();
for (int i = 0; i < len; i++)
a[i] = x[i] - '0';
for (int i = 0; i < len; i++) {
res[i] = (y * 10 + a[i]) / b;
y = (y * 10 + a[i]) % b;
}
while (res[last] == 0 && last < len - 1) last++;
for (int i = last; i < len; i++) cout << res[i];
return 0;
}
标签:运算,高精度,int,100000,n3,nn2,nn1,l3
From: https://blog.csdn.net/p605779/article/details/140751803