也比较简单,麻烦的就是在进制之间的转换,还有数字与字符串间的转换(原来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;
}