十进制非负整数高精度加减乘除(c++)

本文学习自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;
}

乘法, 除法随后更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值