本文学习自http://t.csdn.cn/3ORbr,原文作者是一个初中生, 现在可能不是了。很厉害。
高精度算法本质就是用字符串还原我们竖式计算的步骤,、非十进制的大数可以先转为十进制数再进行高精度运算。
高精度加法:
#include <bits/stdc++.h>
using namespace std;
int main (){
string s1, s2;
cin >> s1 >> s2;
int len1 = s1.length();
int len2 = s2.length();
int anslen = max(len1, len2);
int a[anslen + 1], b[anslen + 1], c[anslen + 1];
memset (a, 0, sizeof(a));
memset (b, 0, sizeof(b));
memset (c, 0, sizeof(c));
for (int i = 1; i <= len1; i ++)a[i] = s1[len1 - i] - '0';
//将第一个大数赋值给a 第二个给b
for (int i = 1; i <= len2; i ++)b[i] = s2[len2 - i] - '0';
int x = 0, lenc = 1; //x是进位
while (lenc <= anslen){
c[lenc] = a[lenc] + b[lenc] + x;
x = c[lenc] / 10;
c[lenc] %= 10;
lenc ++;
}
c[lenc] = x;
while (c[lenc] == 0 && lenc >= 2){
lenc --;
} // 防止第一位是0, 或者是 eg: 000000 + 00000 = 000000 这种情况应该输出0 不是000000
for (int i = lenc; i >= 1; i --){
cout << c[i];
}
return 0;
}
高精度减法:
#include <bits/stdc++.h>
using namespace std;
int main(){
string s1, s2;
cin >> s1 >> s2;
int len1 = s1.length();
int len2 = s2.length();
if (len1 > len2) {
cout << "被减数必须大于减数才能相减";
return 0;
}
int anslen = max(len1, len2);
int a[anslen + 1], b[anslen + 1], c[anslen + 1];
memset (a, 0, sizeof(a));
memset (b, 0, sizeof(b));
memset (c, 0, sizeof(c));
for (int i = 1; i <= len1; i ++)a[i] = s1[len1 - i] - '0';
//将第一个大数赋值给a 第二个给b
for (int i = 1; i <= len2; i ++)b[i] = s2[len2 - i] - '0';
int A = len1, B = len2;
while (A == B && A >= 2 && B >= 2){
if (a[A] == b[B]) A --, B --;
else if (a[A] < b[B]) {
cout << "被减数必须大于减数才能相减";
return 0;
}
else A --, B --;
}
int lenc = 1;
while (lenc <= anslen) { //不能小数减大数
if (a[lenc] < b[lenc]){
a[lenc + 1] --; //即便a[lenc + 1] 是0也可以减,则a[lenc+1]等于负数,负数一定小于b[lenc+1]
// 所以a[lenc + 1]会向a[lenc + 2]借位 直到a[lenc + n] 是正数为止;
c[lenc] = a[lenc] + 10 - b[lenc];
}
else {
c[lenc] = a[lenc] - b[lenc];
}
lenc ++;
}
lenc --;
while (c[lenc] == 0 && lenc >= 2){
lenc --;
}
for (int i = lenc; i >= 1; i --){
cout << c[i];
}
return 0;
}
乘法, 除法随后更新