高精度计算
高精度计算是指参与运算的数大大超出了标准数据类型所能够表示的范围的运算,在C或者C++中,最大的数据类型只有64位,如果需要处理更大的是数,只能用数组来模拟,把大数的每一位存储在数组中,然后按位处理进位,借位问题。当然Java和python能够简单的处理这样的大数问题。
python的高精度加法
a=input() b=input() a=int(a) b=int(b) print(a+b)
就是这么的简洁
还有Java的高精度
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.print(sc.nextBigInteger().add(sc.nextBigInteger()));
}
}
相比之下C++的代码就要更加的复杂
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string Add(string a, string b)
{
string sum;
int Sum = 0;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());//从低位开始模拟相加
int maxn = max(a.size(), b.size());
for (int i = 0; i < maxn; i++) {
if (i < a.size())
Sum += a[i] - '0';//转换成数字
if (i < b.size())
Sum += b[i] - '0';//同理
sum += Sum % 10 + '0';
Sum /= 10;//模拟进位
}
if (Sum)
sum += "1";//判断最后的和是否要进位
reverse(sum.begin(), sum.end());
return sum;
}
int main()
{
string a, b, sum;
cin >> a >> b;
sum = Add(a, b);
cout << sum << endl;
}
接下来是高精度减法
#include<iostream>
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn = 10100;
int a1[maxn], a2[maxn];
bool compare(string a, string b)//判断a是否小于b
{
if (a.size() < b.size()) return true;
if (a.size() > b.size()) return false;
for (int i = 0; i < a.size(); i++) {//逐位比较
if (a[i] > b[i])return false;
if (a[i] < b[i])return true;
}
return false;//最后两个相等
}
int main()
{
string a, b;
cin >> a >> b;
if (compare(a, b)) {
swap(a, b);
putchar('-');
}
for (int i = 0; i < a.size(); ++i) a1[a.size() - i] = a[i] - '0';
for (int i = 0; i < b.size(); ++i) a2[b.size() -i] = b[i] - '0';
for (int i = 1; i <= a.size(); i++) {
a1[i] -= a2[i];
if (a1[i] < 0) {
a1[i + 1]--; //借位
a1[i] += 10;
}
}
int len = a.size();
while (a1[len - 1] == 0 && len > 1)len--;//去除前导零,注意不能把单个零去除
for (int i = len ; i >= 1; i--)
cout << a1[i];
return 0;
}
思路都是非常简单的
然后就是高精度乘法这里有一点和加法不一样的是乘法有个错位相加这里用两个for循环来模拟
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 10010;
int a1[maxn], a2[maxn], ans[100001];
int main()
{
string a, b;
cin >> a >> b;
for (int i = 1; i <= a.size(); i++)a1[i] = a[a.size() - i] - '0';
for (int i = 1; i <= b.size(); i++)a2[i] = b[b.size() - i] - '0';
for (int i = 1; i <= b.size(); i++) {
for (int j = 1; j <= a.size(); j++)
ans[i + j - 1] += a1[j] * a2[i];//模拟错位相加
}
int len = a.size() + b.size();
for (int i = 1; i < len; i++) {
if (ans[i] > 9) {
ans[i + 1] += ans[i] / 10;//进位
ans[i] %= 10;
}
}
while (ans[len] == 0 && len > 1) len--;//去除前导零,这一步和高精度加法一样
for (int i = len; i >= 1; i--)
cout << ans[i];
return 0;
}