sicily--1813. M进制数问题

也比较简单,麻烦的就是在进制之间的转换,还有数字与字符串间的转换(原来string 中的reserve()函数是用来保留空间的,英语没学好,一直以为可以是用来将字符串倒转的,唉)

#include<iostream>
#include<string>
using namespace std;

class Digit
{
public:
	Digit()
	{
		base = 10;
		numInDecimal = 0;
	}
	//初始化基数
	void SetBase(int b)
	{
		this->base = b;
	}//end method SetBase

	//获取基数
	int GetBase()
	{
		return this->base;
	}//end method GetBase

	//将输入的数字转换为10进制
	void ToDecimal(string original)
	{
		int counter = 0;//标记从字符串右数起的位数
		//从字符串尾端开始
		for(int i = original.length() - 1; i >= 0; i--)
		{
			int temp = 0;//某一位上的数字转为十进制的值
			switch(original[i])
			{
			case '0':
				temp = 0;break;
			case '1':
				temp = 1;break;
			case '2':
				temp = 2;break;
			case '3':
				temp = 3;break;
			case '4':
				temp = 4;break;
			case '5':
				temp = 5;break;
			case '6':
				temp = 6;break;
			case '7':
				temp = 7;break;
			case '8':
				temp = 8;break;
			case '9':
				temp = 9;break;
			case 'A':
				temp = 10;break;
			case 'B':
				temp = 11;break;
			case 'C':
				temp = 12;break;
			case 'D':
				temp = 13;break;
			case 'E':
				temp = 14;break;
			case 'F':
				temp = 15;break;
			case 'G':
				temp = 16;break;
			case 'H':
				temp = 17;break;
			case 'I':
				temp = 18;break;
			case 'J':
				temp = 19;break;
			case 'K':
				temp = 20;break;
			case 'L':
				temp = 21;break;
			case 'M':
				temp = 22;break;
			case 'N':
				temp = 23;break;
			case 'O':
				temp = 24;break;
			case 'P':
				temp = 25;break;
			case 'Q':
				temp = 26;break;
			case 'R':
				temp = 27;break;
			case 'S':
				temp = 28;break;
			case 'T':
				temp = 29;break;
			case 'U':
				temp = 30;break;
			case 'V':
				temp = 31;break;
			case 'W':
				temp = 32;break;
			case 'X':
				temp = 33;break;
			case 'Y':
				temp = 34;break;
			case 'Z':
				temp = 35;break;
			}//end switch

			//存储在numInDecimal中
			for(int j = 0; j < counter; j++)
			{
				temp = temp * this->base;//counter 为0不用操作
			}
			this->numInDecimal = this->numInDecimal + temp;
			counter++;//移至下一位
		}//end loop for
	}//end method ToDecimal

	//将十进制转为相应进制的字符串
	string ToString(int resultInDecimal)
	{
		string result = "";//初始化为空
		int counter = 0;
		int weight = 1;
		while(resultInDecimal != 0)
		{
			weight = weight * this->base;
			int remainder = resultInDecimal % this->base;
			resultInDecimal = resultInDecimal / this->base;//resultInDecimal取为商
			char temp;
			switch(remainder)
			{
			case 0:
				temp = '0';break;
			case 1:
				temp = '1';break;
			case 2:
				temp = '2';break;
			case 3:
				temp = '3';break;
			case 4:
				temp = '4';break;
			case 5:
				temp = '5';break;
			case 6:
				temp = '6';break;
			case 7:
				temp = '7';break;
			case 8:
				temp = '8';break;
			case 9:
				temp = '9';break;
			case 10:
				temp = 'A';break;
			case 11:
				temp = 'B';break;
			case 12:
				temp = 'C';break;
			case 13:
				temp = 'D';break;
			case 14:
				temp = 'E';break;
			case 15:
				temp = 'F';break;
			case 16:
				temp = 'G';break;
			case 17:
				temp = 'H';break;
			case 18:
				temp = 'I';break;
			case 19:
				temp = 'J';break;
			case 20:
				temp = 'K';break;
			case 21:
				temp = 'L';break;
			case 22:
				temp = 'M';break;
			case 23:
				temp = 'N';break;
			case 24:
				temp = 'O';break;
			case 25:
				temp = 'P';break;
			case 26:
				temp = 'Q';break;
			case 27:
				temp = 'R';break;
			case 28:
				temp = 'S';break;
			case 29:
				temp = 'T';break;
			case 30:
				temp = 'U';break;
			case 31:
				temp = 'V';break;
			case 32:
				temp = 'W';break;
			case 33:
				temp = 'X';break;
			case 34:
				temp = 'Y';break;
			case 35:
				temp = 'Z';break;
			}//end switch
			
			result = result + temp;
		}
		if(result.length() == 0)
			result = "0";
		string tempResult = "";
		for(int i = result.length() - 1; i >= 0 ; i--)
		{
			tempResult.push_back(result[i]);
		}
		return tempResult;
	}

	//重载“/”函数
	friend string operator /(Digit left, Digit right)
	{
		int resultInDecimal = left.numInDecimal / right.numInDecimal;
		return left.ToString(resultInDecimal);
	}

	//重载“%”函数
	friend string operator %(Digit left, Digit right)
	{
		int resultInDecimal = left.numInDecimal % right.numInDecimal;
		return left.ToString(resultInDecimal);
	}//end method %
private:
	int base;//base表示基数
	int numInDecimal;//该数字的十进制表示
};
int main()
{
	int caseNum;
	cin >> caseNum;
	while(caseNum--)
	{
		Digit a, b;
		int base;
		cin >> base;
		a.SetBase(base);
		b.SetBase(base);
		string left, right;
		cin >> left >> right;
		a.ToDecimal(left);
		b.ToDecimal(right);
		string result = a / b;
		cout << result << endl;
		result = a % b;
		cout << result << endl;
	}//end while
	
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值