高精度加法和高精度减法算法

发布时间:2024年01月17日

洛谷题目链接:

高精度加法:https://www.luogu.com.cn/problem/P1601

高精度减法:https://www.luogu.com.cn/problem/P2142

高精度加法解题步骤:

1. 高精度数字利用字符串读入

2.把字符串翻转存入两个整形数组A,B

3.从低位到高位,累加,进位,存余

4.把数组C从高位到地位依次输出

我的代码:

?数组做法:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 1000;
int a[N], b[N], c[N];
int la, lb, lc;
void add(int a[], int b[], int c[]) {
	for (int i = 0; i < lc; i++) {
		c[i] += a[i] + b[i];//累加
		c[i + 1] += c[i] / 10;//进位
		c[i] %= 10;//存余
	}
	if (c[lc])lc++;
}
int main() {
	string s1, s2;
	cin >> s1 >> s2;
	la = s1.size(), lb = s2.size();
	lc = max(la, lb);
	for (int i = la - 1; ~i; i--)a[la - 1 - i] = s1[i] - '0';
	for (int i = lb - 1; ~i; i--)b[lb - 1 - i] = s2[i] - '0';
	add(a, b, c);
	for (int i = lc - 1; ~i; i--)cout << c[i];
	return 0;
}

?vector容器做法:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> VI;
VI a, b, c;
void add(VI& a, VI& b, VI& c) {
	int t = 0;
	for (int i = 0; i < a.size() ||i< b.size(); i++) {
		if (i < a.size())t += a[i];
		if (i < b.size())t += b[i];
		c.push_back(t % 10);//存余
		t /= 10;//进位
	}
	if (t)c.push_back(t);
}
int main() {
	string s1, s2;
	cin >> s1 >> s2;
	for (int i = s1.size() - 1; ~i; i--)a.push_back(s1[i]-'0');
	for (int i = s2.size() - 1; ~i; i--)b.push_back(s2[i]-'0');
	add(a, b, c);
	for (int i = c.size() - 1; ~i; i--)cout << c[i];
	return 0;
}

高精度减法解题步骤:

1.高精度数字利用字符串读入

2.把字符串翻转存入两个整形数组A,B

3.若A<B,则交换A,B,输出负号

4.从低位到高位,逐位求差,借位,存差

5.把数组C从高位到低位依次输出

我的代码:

?数组做法:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 11000;
int a[N], b[N], c[N];
int la, lb, lc;
bool cmp(int a[], int b[]) {
	if (la != lb)return la > lb;//返回真不交换
	for (int i = la-1; i >=0; i--) {
		if (a[i] != b[i])return a[i] > b[i];
	}
	return true; //避免出现-0;
}
void sub(int a[], int b[], int c[]) {
	for (int i = 0; i < lc; i++) {
		if (a[i] < b[i])
			a[i + 1]--, a[i] += 10;
		c[i] = a[i] - b[i];
	}
	while (lc && c[lc] == 0)lc--;//处理前导0
}
int main() {
	string s1, s2;
	cin >> s1 >> s2;
	la = s1.size(), lb = s2.size();
	lc = max(la, lb);
	for (int i = la - 1; ~i; i--)a[la - 1 - i] = s1[i]-'0';
	for (int i = lb - 1; ~i; i--)b[lb - 1 - i] = s2[i] - '0';
	if (!cmp(a, b))swap(a, b), cout << "-";
	sub(a, b, c);
	for (int i = lc; ~i; i--)cout << c[i];
	return 0;
}

?vector容器做法:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef vector<int> VI;
VI a, b, c;
bool cmp(VI& a, VI& b) {
	if (a.size() != b.size())return a.size() > b.size();
	for (int i = a.size() - 1; i >= 0; i--) {
		if (a[i] != b[i])return a[i] > b[i];
	}
	return true; //避免出现-0
}
void sub(VI& a, VI& b, VI& c) {
	int t = 0;
	for (int i = 0; i < a.size(); i++) {
		t = a[i];
		if (i < b.size())t -= b[i];
		if (t < 0)a[i + 1]--,t+=10;
		c.push_back(t);
	}
	while (c.size() > 1 && !c.back())c.pop_back(); //处理前导0
}
int main() {
	string s1, s2;
	cin >> s1 >> s2;
	for (int i = s1.size() - 1; ~i; i--)a.push_back(s1[i] - '0');
	for (int i = s2.size() - 1; ~i; i--)b.push_back(s2[i] - '0');
	if (!cmp(a, b))swap(a, b),cout<<"-";//保证a永远比b大
	sub(a, b, c);
	for (int i = c.size() - 1; ~i; i--)cout << c[i];
	return 0;
}

文章来源:https://blog.csdn.net/qq_60794824/article/details/135583990
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。