• 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;
    }

     

  • 相关阅读:
    Hadoop 的版本问题
    SSH 端口转发原理
    KM算法
    最大流算法小结
    pku 2195 KM算法求最小权二分匹配
    SAP(最短增广路算法) 最大流模板
    最大流模板
    pku 1459 最大流 SAP
    pku Drainage Ditches 简单最大流 直接套模板 注意可能有重边
    推荐:吴军 谷歌黑板报 《浪潮之颠》
  • 原文地址:https://www.cnblogs.com/mangci/p/3125763.html
Copyright © 2020-2023  润新知