高精度算法加减乘除详解c++

目录

输入

关于进位

输出

高精度加法

高精度减法

高精度乘法

高精度除法


输入

输入数时用数组存储,将每一位数储存进数组

string a;
int na[100001];
void lay(string a) {
	int len1 = a.size();
	for (int i = 0;i < len1;i++) {
		na[len1 - 1 - i] = a[i] - '0';
	}
}

关于进位

加法

na[i] += nb[i] + carry;//每一位相加,carry表示上一位数加过来的进位
carry= na[i] / 10;//算出这一位数的进位
na[i] %= 10;

减法

	int lmax = max(len1, len2);//获取最大长度
	for (int i = 0;i < lmax;i++)
	{
		if (na[i] < nb[i])//如果该位数B的更大,则向后一位数借个1
		{
			na[i + 1]--;
			na[i] += 10;
		}
		na[i] -=nb[i];
	}
	while (na[lmax-1] == 0 && lmax > 1) lmax--;//如果最后面还存在借位,则需减低最大长度
//注意这里要用while 如果最高位存在多个0的话就要一直减低最大长度

乘法

int lmax = len1+ len2;//获取最大长度 注意这里是+,与前面的不同
	for (int i = 0;i <len1;i++)
		for (int j = 0;j < len2;j++)
		{
			c[i + j ] += na[i] * nb[j];//乘法对应的表达式
			c[i + j] += c[i + j - 1] / 10;
			c[i + j - 1] %= 10;
		}
	while (c[lmax-1] == 0 && lmax > 1) lmax--;

除法

c[i] = (x * 10 + na[i]) / b;
x = (x * 10 + na[i]) % b;

输出

关于输出  由于数组是从低位开始储存的,所以我们要从高位开始加至新的字符串(此处也可以采取直接从高位输出的方式)

for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';//从高位开始加至新的字符串
cout << c << endl;//输出字符串

高精度加法

例题洛谷P1601P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

AC代码(逐句逐段分析)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001];
int main() {
	string a, b, c;cin >> a >> b;//将a,b以字符串的形式输入
	int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
	for (int i = 0;i < len1;i++) {
		na[len1 - 1 - i] = a[i] - '0';
	}
	for (int i = 0;i < len2;i++) {
		nb[len2 - 1 - i] = b[i] - '0';
	}
	//将每一位数储存进数组中
	int lmax = max(len1, len2);//获取最大长度
		int carry = 0;//初始化进位为0
		//将每一位都相加,并算出进位加到后一位数中
		for (int i = 0;i < lmax;i++) {
			na[i] += nb[i] + carry;//每一位相加,carry表示上一位数加过来的进位
			carry= na[i] / 10;//算出这一位数的进位
			na[i] %= 10;
		}
		if (carry > 0)na[lmax++] = carry;//如果最高位有进位,最大数位+1
		for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';//从高位开始加至新的字符串
		cout << c << endl;//输出字符串
}

例题HDU1002A + B Problem II - HDU 1002 - Virtual Judge (vjudge.net)A + B Problem II - HDU 1002 - Virtual Judge (vjudge.net)

AC代码

#include<iostream>
#include<string>
#include<algorithm>
const int L = 1100;
using namespace std;
int main() {
	int t;cin >> t;
	for (int j = 1;j <= t;j++) {
		string a, b;cin >> a >> b;string c;
		int na[L] = { 0 }, nb[L] = { 0 };
		cout << "Case " << j << ":" << endl;
		int len1 = a.length(), len2 = b.length();
		for (int i = 0;i < len1;i++)na[len1 - 1 - i] = a[i] - '0';
		for (int i = 0;i < len2;i++)nb[len2 - 1 - i] = b[i] - '0';
		int lmax = len1 > len2 ? len1 : len2;
		for (int i = 0;i < lmax;i++) {
			na[i] += nb[i];
			na[i + 1] += na[i] / 10;
			na[i] %= 10;
		}
		if (na[lmax])lmax++;
		for (int i = lmax - 1;i >= 0;i--)c += na[i] + '0';
		cout << a << " + " << b << " = " << c << endl;
		if(j!=t)
		cout << endl;
	}
}

高精度减法

例题 洛谷P2142P2142 高精度减法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

AC代码(逐句逐段分析)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001];
bool judge(string a, string b) {
	int u =a.size(), v = b.size();
	if (u != v) return u > v;
	/*
	如果u>v,那么肯定有s1>s2,返回ture
	如果u==v,那么就进行下面的比较
	*/
	for (int i = 0;i < u;i++)
	{
		if (a[i] != b[i]) return a[i] > b[i];
	}
	return true;
}
int main() {
	string a, b, c;cin >> a >> b;//将a,b以字符串的形式输入
	if (!judge(a, b)) { 
		string c = a;
		a = b;
		b = c;
		cout << "-"; 
}//如果a<b则输出负数 ,同时改变a,b位置
	int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
	for (int i = 0;i < len1;i++) {
		na[len1 - 1 - i] = a[i] - '0';
	}
	for (int i = 0;i < len2;i++) {
		nb[len2 - 1 - i] = b[i] - '0';
	}
	//将每一位数储存进数组中
	int lmax = max(len1, len2);//获取最大长度
	for (int i = 0;i < lmax;i++)
	{
		if (na[i] < nb[i])//如果该位数B的更大,则向后一位数借个1
		{
			na[i + 1]--;
			na[i] += 10;
		}
		na[i] -=nb[i];
	}
	while (na[lmax-1] == 0 && lmax > 1) lmax--;//如果最后面还存在借位,则需减低最大长度
	//注意这里要用while 如果最高位存在多个0的话就要一直减低最大长度
	for (int i = lmax - 1;i >= 0;i--)cout << na[i];//从高位开始输出

}

高精度乘法

例题

洛谷P1303P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

AC代码(逐句逐段分析)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string a;
int na[100001], nb[100001],c[100001];
int main() {
	string a, b;cin >> a >> b;//将a,b以字符串的形式输入
	int len1 = a.size(), len2 = b.size();//利用size()函数获取a,b的长度
	for (int i = 0;i < len1;i++) {
		na[len1 - 1 - i] = a[i] - '0';
	}
	for (int i = 0;i < len2;i++) {
		nb[len2 - 1 - i] = b[i] - '0';
	}
	//将每一位数储存进数组中
	int lmax = len1+ len2;//获取最大长度
	for (int i = 0;i <len1;i++)
		for (int j = 0;j < len2;j++)
		{
			c[i + j ] += na[i] * nb[j];//乘法对应的表达式
			c[i + j] += c[i + j - 1] / 10;
			c[i + j - 1] %= 10;
		}
	while (c[lmax-1] == 0 && lmax > 1) lmax--;
	for (int i = lmax - 1;i >= 0;i--)cout << c[i];//从高位开始输出

}

高精度除法

高精度除以低精度

例题 

洛谷P1480P1480 A/B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

AC代码(逐句逐段分析)

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int na[100001], nb[100001], c[100001];
int main() {
	string a;ll b,x=0;
	cin >> a >> b;//将a,b以字符串的形式输入
	int lmax = a.size();//利用size()函数获取a的长度
	for (int i = 0;i < lmax;i++) {
		na[i] = a[i] - '0';
	}
	//将每一位数储存进数组中 不用转置
	for (int i = 0;i < lmax;i++)
	{
		c[i] = (x * 10 + na[i]) / b;
		x = (x * 10 + na[i]) % b;
	}
	int lmin = 0;
	while (c[lmin] == 0 && lmin <= lmax) lmin++;
	for (int i = lmin;i < lmax;i++)
	{
		cout << c[i];
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值