洛谷 题解 P1604 【B进制星球】

题目:P1604 B进制星球

本人提交记录:R6292872

作为一个极其无聊的人,我没事干地写了operator。。。

思路很简单:

读入b

读入b进制的x,y

ans = x + y

输出ans

用了operator,貌似难解释一点。

但我认为,以大家那都高于我的智商,不会不理解高精加法。

我只需要介绍一下一些变量和函数%%%

全局变量 b : b进制
struct类型 bint : b进制高精数
bint类型 x,y,ans : x,y用于输入,ans存储答案值

还要介绍一下bint类型的变量&方法orz:

beta 存储高精数
len 存储高精数长度

bint() 初始化
mem() 初始化,形参为初始化后每位的值
operator + () 加法operator定义
operator >> () 输入operator定义
operator << () 输出operator定义

最后上代码:

#include <string.h>
#include <iostream>
#define MAX 2001
using namespace std;

int b;

struct bint {
	int beta[MAX];
	int len;
	bint()
	{
		mem(0);
		len = 0;
	}
  	void mem(int cmd)
  	{
  		memset(beta, cmd, sizeof(beta));
  	}
  	bint operator + (const bint &other) const
  	{
		if (len == 0) return other;
		if (other.len == 0) return *this;
		bint ans;
		int maxlen = len > other.len ? len : other.len;
		for (int i = 0; i < maxlen; i++) {
			ans.beta[i] += beta[i] + other.beta[i];
			ans.beta[i + 1] += ans.beta[i] / b;
			ans.beta[i] = ans.beta[i] % b;
		}
		if (ans.beta[maxlen] != 0) ans.len = maxlen + 1;
		else ans.len = maxlen;
		return ans;
  	}
  	friend istream &operator >> (istream &in, bint &other)
  	{
		string str;
		in >> str;
		for (int i = 0; i < str.size(); i++) {
			if (str[i] > '9') other.beta[str.size() - i - 1] = str[i] - 55; 
			else other.beta[str.size() - i - 1] = str[i] - 48;
		}
		other.len = str.size();
  	}
  	friend ostream &operator << (ostream &out, bint &other)
  	{
		for (int i = other.len - 1; i >= 0; i--) {
			if (other.beta[i] > 9) out << (char)(other.beta[i] + 55); 
			else out << (char)(other.beta[i] + 48);
		}
  	}
};

int main()
{
	bint x, y, ans;
	cin >> b;
	cin >> x;
	cin >> y;
	ans = x + y;
	cout << ans;
    return 0;
}

慢慢看。。。

原文地址:https://www.cnblogs.com/hkxadpall/p/9895915.html