算法学习笔记之高精度

高精度计算

高精度计算是指参与运算的数大大超出了标准数据类型所能够表示的范围的运算,在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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值