经常遇到不同进制之间的转换,下面办法主要是讨论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; }