PAT算法题大整数运算之string加减法实现

PAT中常考的大整数运算一般是加减法,乘除法少有考察。《算法笔记》上用的结构体实现,这里选用STL中的string容器实现,代码如下:
:题目中可能会给出两个大整数的长度或者大小关系等条件,那么又可以根据情况精简代码!比如:1024. Palindromic Number (25)

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string add(string a, string b) {
	reverse(a.begin(), a.end()); //将高位置于数组高位便于计算
	reverse(b.begin(), b.end());
	if (a.size() > b.size()) b.resize(a.size(), '0'); //高位补0
	else a.resize(b.size(), '0');
	int len = a.size();
	string r = string(len,'0'); //result
	int carry = 0;
	for (int i = 0; i < len; i++) {
		int tem = a[i] - '0' + b[i] - '0' + carry;
		r[i] = tem % 10 + '0';
		carry = tem / 10;
	}
	if (carry != 0) r += "1"; //还有进位则补在高位(字符串连接)
	reverse(r.begin(), r.end()); //倒转
	return r;
}
string sub(string a, string b) {
	bool flag = true;
	//判断大小并补0
	if (a.size() > b.size()) {
		b.resize(a.size(), '0');
	}
	else if (a.size() < b.size()) {
		a.resize(b.size(), '0');
		swap(a, b);   //交换
		flag = false;
	}
	else if (a < b) {
		swap(a, b);
		flag = false;
	}
	reverse(a.begin(), a.end());
	reverse(b.begin(), b.end());
	int len = a.size();
	string r = string(len, '0');  //result
	for (int i = 0; i < len; i++) {
		if (a[i] < b[i]) {
			a[i] += 10;  //不足借位
			a[i + 1]--;
		}
		r[i] = a[i] - b[i] + '0';  //注意+'0'
	}
	reverse(r.begin(), r.end());
	//删除高位多余的0,但注意保证如果结果为0,留一个0
	while (r[0] == '0' && r.size() > 1) { 
		r.erase(r.begin());
	}
	if (!flag) r = "-" + r;  //如果a<b输出负号
	return r;
}
int main() {
	string a, b;
	cin >> a >> b;
	cout << add(a, b) << endl << sub(a, b);
	return 0;
}
发布了26 篇原创文章 · 获赞 5 · 访问量 429

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104078378