N进制到M进制的转换问题

经常遇到不同进制之间的转换,下面办法主要是讨论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 个nm进制整数AB,计算m进制数整数P = A / B (向下取整)与 = 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;
}

 

 

 

posted @ 2013-06-08 10:19  芒刺  阅读(1023)  评论(1编辑  收藏  举报