经常遇到不同进制之间的转换,下面办法主要是讨论2到36之间进制转换问题。其实进制转换办法就是辗转相除,比如:如果我想把15进制转换成17进制。
首先是将15进制转换成10进制,然后再将10进制的值转换成17进制,因此这个问题可以简化为两个问题:(1)N进制转换成10进制,(2)10进制转换成M进制。
1-----下面是讨论如何将N进制转成10进制
int M2N(int n,string s){//s代表一个N进制的数,现在将它转成10进制,比如:16进制:25FF2
if(s == "0")
return 0;
int len = s.length();//获取s的长度
int sum=0;
int a=0;
for(int i=0;i<len;i++){ //转换公式:sum = 2*16^4+5*16^3+F*16^2+F*16+2;
switch(s[i]){
case '0' : a = 0;break;
case '1' : a = 1;break;
case '2' : a = 2;break;
case '3' : a = 3;break;
case '4' : a = 4;break;
case '5' : a = 5;break;
case '6' : a = 6;break;
case '7' : a = 7;break;
case '8' : a = 8;break;
case '9' : a = 9;break;
case 'A' : a = 10;break;
case 'B' : a = 11;break;
case 'C' : a = 12;break;
case 'D' : a = 13;break;
case 'E': a = 14;break;
case 'F' : a = 15;break;
case 'G' : a = 16;break;
case 'H' : a = 17;break;
case 'I' : a = 18;break;
case 'J' : a = 19;break;
case 'K' : a = 20;break;
case 'L' : a = 21;break;
case 'M' : a = 22;break;
case 'N' : a = 23;break;
case 'O' : a = 24;break;
case 'P' : a = 25;break;
case 'Q' : a = 26;break;
case 'R' : a = 27;break;
case 'S' : a = 28;break;
case 'T' : a = 29;break;
case 'U' : a = 30;break;
case 'V' : a = 31;break;
case 'W' : a = 32;break;
case 'X' : a = 33;break;
case 'Y' : a = 34;break;
case 'Z' : a = 35;break;
}
sum=sum*n+a;
}
return sum;
}
2 ---------接着讨论10进制转成N进制问题
这个主要用到了辗转相除原理,比如将100转成16进制,先是100除以16余数是4 ,商是6,将余数4插到字符串s前面s=4,接着是6除以16,余数是6,商是0,将余数6插到字符串s前面,即s=64,。这时商为0,将停止操作。
string N2M(int n,int num){
if(num == 0)
return "0";
int r,q = num;
string sum;
while(q!=0){
r = q % n;
q = q / n;
char a;
switch(r){
case 0 : a = '0';break;
case 1 : a = '1';break;
case 2 : a = '2';break;
case 3 : a = '3';break;
case 4 : a = '4';break;
case 5 : a = '5';break;
case 6 : a = '6';break;
case 7 : a = '7';break;
case 8 : a = '8';break;
case 9 : a = '9';break;
case 10 : a = 'A';break;
case 11 : a = 'B';break;
case 12 : a = 'C';break;
case 13 : a = 'D';break;
case 14 : a = 'E';break;
case 15 : a = 'F';break;
case 16 : a = 'G';break;
case 17 : a = 'H';break;
case 18 : a = 'I';break;
case 19 : a = 'J';break;
case 20 : a = 'K';break;
case 21 : a = 'L';break;
case 22 : a = 'M';break;
case 23 : a = 'N';break;
case 24 : a = 'O';break;
case 25 : a = 'P';break;
case 26 : a = 'Q';break;
case 27 : a = 'R';break;
case 28 : a = 'S';break;
case 29 : a = 'T';break;
case 30 : a = 'U';break;
case 31 : a = 'V';break;
case 32 : a = 'W';break;
case 33 : a = 'X';break;
case 34 : a = 'Y';break;
case 35 : a = 'Z';break;
}
sum.insert(0,1,a);
}
return sum;
}
以上就是N到M进制的转换办法。
下面就是sicily -------1813
1813. M进制数问题
Description
试用 C++的类来表示一般进制数。
给定 2 个n位m进制整数A和B,计算m进制数整数P = A / B (向下取整)与 Q = A % B的值。
Input
输入包含多个测试点。第一行为一个整数T,表示测试点数。
对于每个测试点第 1 行是进制 m 。第 2 行和第 3 行分别给出 m 进制整数 A 和 B。
所有 m 进制数的10进制表示均不超出int范围。
Output
对于每个测试点,第一行输出 m 进制数整数 P = A / B 的值,第二行输出 Q = A % B 的值。
Sample Input
1 16 29FA5 7
Sample Output
5FF3 0
下面就是源码:
#include<iostream>
#include<string>
using namespace std;
class transfer{
public:
string N2M(int n,int num){
if(num == 0)
return "0";
int r,q = num;
string sum;
while(q!=0){
r = q % n;
q = q / n;
char a;
switch(r){
case 0 : a = '0';break;
case 1 : a = '1';break;
case 2 : a = '2';break;
case 3 : a = '3';break;
case 4 : a = '4';break;
case 5 : a = '5';break;
case 6 : a = '6';break;
case 7 : a = '7';break;
case 8 : a = '8';break;
case 9 : a = '9';break;
case 10 : a = 'A';break;
case 11 : a = 'B';break;
case 12 : a = 'C';break;
case 13 : a = 'D';break;
case 14 : a = 'E';break;
case 15 : a = 'F';break;
case 16 : a = 'G';break;
case 17 : a = 'H';break;
case 18 : a = 'I';break;
case 19 : a = 'J';break;
case 20 : a = 'K';break;
case 21 : a = 'L';break;
case 22 : a = 'M';break;
case 23 : a = 'N';break;
case 24 : a = 'O';break;
case 25 : a = 'P';break;
case 26 : a = 'Q';break;
case 27 : a = 'R';break;
case 28 : a = 'S';break;
case 29 : a = 'T';break;
case 30 : a = 'U';break;
case 31 : a = 'V';break;
case 32 : a = 'W';break;
case 33 : a = 'X';break;
case 34 : a = 'Y';break;
case 35 : a = 'Z';break;
}
sum.insert(0,1,a);
}
return sum;
}
int M2N(int n,string s){
if(s == "0")
return 0;
int len = s.length();
int sum=0;
int a=0;
for(int i=0;i<len;i++){
switch(s[i]){
case '0' : a = 0;break;
case '1' : a = 1;break;
case '2' : a = 2;break;
case '3' : a = 3;break;
case '4' : a = 4;break;
case '5' : a = 5;break;
case '6' : a = 6;break;
case '7' : a = 7;break;
case '8' : a = 8;break;
case '9' : a = 9;break;
case 'A' : a = 10;break;
case 'B' : a = 11;break;
case 'C' : a = 12;break;
case 'D' : a = 13;break;
case 'E': a = 14;break;
case 'F' : a = 15;break;
case 'G' : a = 16;break;
case 'H' : a = 17;break;
case 'I' : a = 18;break;
case 'J' : a = 19;break;
case 'K' : a = 20;break;
case 'L' : a = 21;break;
case 'M' : a = 22;break;
case 'N' : a = 23;break;
case 'O' : a = 24;break;
case 'P' : a = 25;break;
case 'Q' : a = 26;break;
case 'R' : a = 27;break;
case 'S' : a = 28;break;
case 'T' : a = 29;break;
case 'U' : a = 30;break;
case 'V' : a = 31;break;
case 'W' : a = 32;break;
case 'X' : a = 33;break;
case 'Y' : a = 34;break;
case 'Z' : a = 35;break;
}
sum=sum*n+a;
}
return sum;
}
};
int main(){
int t;
cin>>t;
int n;
string s1,s2;
transfer tran;
while(t--){
cin>>n;
cin>>s1>>s2;
int num1 = tran.M2N(n,s1);
int num2 = tran.M2N(n,s2);
int p = num1/num2;
int q = num1%num2;
string ss1,ss2;
ss1 = tran.N2M(n,p);
ss2 = tran.N2M(n,q);
cout<<ss1<<endl;
cout<<ss2<<endl;
}
return 0;
}