在进行高精度数的运算之前,我们先搞清楚一下定义:
我们把超出long long定义范围的整数叫做高精度数,也叫做大数。
对于这种无法存储的死皮赖脸的整数,只好使用char数组给他一锅端了存储,再存进int数组进行运算。
如下是一个存储再输出高精度数的范例,供参考。
#include<iostream>
using namespace std;
int main()
{
char a[1000];
cin >> a;
cout << a;
return 0;
}
很简单,对吧?
但是要进行运算,我们最好还是读入后存进int数组里
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[1000];
int b[1000];
cin >> a;
for(int i = 0;i < strlen(a); i++)
{
b[i] = a[i] - 48;//SCAII码转换成数字
cout << b[i];
}
return 0;
}
对于加法,由于我们竖式运算要进位,所以要把这堆恶心的char数组倒序存储。
如下是一个倒序存储程序。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[1000];
int b[1000];
cin >> a;
int y = strlen(a) - 1;
for(int i = 0;i < strlen(a);i++)
{
b[i] = a[y] - 48;
cout << b[i];
y--;
}
return 0;
}
对于加法而言,我们先搞清楚一下步骤:
1.输入
2.倒序存储
3.每一位相加并判断进位
4.存储结果
5.将结果倒序输出
代码(可进位):
#include<iostream>
#include<cstring>
using namespace std;
int main() {
char a[1000];
char b[1000];
int a1[1000] = {}, b1[1000] = {}, c1[1001] = {};
cin >> a >> b;
int x = 0, y = 0;
if (strlen(a) > strlen(b)) {
y = strlen(a);
} else {
y = strlen(b);
}
for (int i = 0; i < strlen(a) ; i++) {
a1[i] = a[strlen(a) - i - 1] - '0';
}
for (int i = 0; i < strlen(b) ; i++) {
b1[i] = b[strlen(b) - i - 1] - '0';
}
int c = 0;
while (c < y) {
c1[c] = a1[c] + b1[c] + x;
x = c1[c] / 10;
c1[c] %= 10;
c++;
}
if (x) {
c1[c] = x;
c++;
}
for(int i = 0;i < c; i++)
{
cout << c1[c - 1 - i];
}
cout << endl;
return 0;
}