题解 | #进制转换2#

进制转换2

http://www.nowcoder.com/practice/ae4b3c4a968745618d65b866002bbd32

自己现场写运算符重载太容易出错了,以后一定要记得背一套固定的Bigint的重载函数

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
#include <functional>
#include <cmath>

using namespace std;

class Bigint{
public:
	string num;
	Bigint(int x){
		if(!x){
			num.push_back('0');
		}else{
			while(x){
				num.push_back(x%10+'0');
				x/=10;
			}
		}
	}
	//需要重载4个:+=,*=,/=,% 
	void operator+=(int x){
		string xtmp;
		string ans;
		if(x == 0){
			xtmp.push_back('0');
		}else{
			while(x){
				xtmp.push_back(x%10+'0');
				x /= 10;
			}
		}
		reverse(num.begin(),num.end());
		if(num.size() > xtmp.size()){
			xtmp.append(num.size()-xtmp.size(), '0');
		}else if(num.size() < xtmp.size()){
			num.append(xtmp.size()-num.size(), '0');
		}
		int last = 0;
		for(int i=0; i<num.size(); i++){
			int tmp = num[i]-'0'+xtmp[i]-'0'+last;
			last = tmp/10;
			ans.push_back(tmp%10+'0');
		}
		if(last){
			ans.push_back(last);
		}
		reverse(ans.begin(),ans.end());
		num = ans;
	}
	
	void operator*=(int x){
		string ans;
		reverse(num.begin(),num.end());
		int last = 0;
		for(int i=0; i<num.size(); i++){
			int tmp = (num[i]-'0')*x + last;
			last = tmp/10;
			ans.push_back(tmp%10+'0');
		}
		while(last){
			ans.push_back(last%10 + '0');
			last /= 10;
		}
		reverse(ans.begin(),ans.end());
		num.clear();
		num = ans;
	}
	
	void operator/=(int x){
		string ans;
		int last = 0;
		for(int i=0; i<num.size(); i++){
			last *= 10;
			int tmp = num[i]-'0'+last;
			if(tmp>=x || (tmp<x&&!ans.empty()) || (tmp<x&&i==num.size()-1)){
				ans.push_back(tmp/x + '0');
			}
			last = tmp%x;
		}
		num.clear();
		num = ans;
	}
	
	int operator%(int x) const { //由除法修改,输出余数即可 
		int last = 0;
		for(int i=0; i<num.size(); i++){
			last *= 10;
			last = (num[i]-'0'+last)%x;
		}
		return last;
	}
};

int Char2Int(char ch){
	if(ch>='0' && ch<='9'){
		return ch-'0';
	}else if(ch>='A' && ch<='Z'){
		return ch-'A'+10;
	}else{
		printf("Error.\n");
		exit(0);
		return 0;
	}
}

char Int2Char(int x){
	if(x>=0 && x<=9){
		return x+'0';
	}else if(x>=10 && x<=35){
		return x-10+'A';
	}else{
		printf("Error.\n");
		exit(0);
		return ' ';
	}
}

string ConvertM2N(const string &x, int m, int n){//大于十进制的情况:需要实现字符与数字转换 
	string xn;
	Bigint xt = 0; 
	//以m进制的读法读x,转换为n进制输出 不考虑非法输入
	//先把x转为十进制
	for(int i=0; i<x.size(); i++){//是这里xt会产生越界 
		xt *= m;
		xt += Char2Int(x[i]);
	}
	if(xt.num == "0"){
		xn.push_back('0');
	}else{
		while(xt.num != "0"){
			xn.push_back(Int2Char(xt%n));
			xt /= n;
		}
	}
	reverse(xn.begin(),xn.end());
	return xn;
}

int main(){
	int m, n;
	string x;
	while(scanf("%d%d",&m,&n) != EOF){
		getchar();
		getline(cin, x);
		printf("%s\n",ConvertM2N(x,m,n).c_str());
		x.clear();
	}
	return 0;
}
全部评论

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务