洛谷P1143进制转换

  这个题呢,是一个有关进制的题。乍一看,n进制直接转m进制似乎很难。

 

  但其实,我们可以建一座“大桥”——10进制。

  我们先把n进制转成10进制,再把10进制转成m进制。

  有了这个过渡,一切都好办的多了。

  考虑到大于10的进制会出现大写字母,所以我们输入一个字符数组。

    char a[10],l[40];

    int n,m;
    cin>>n>>a;
    cin>>m;
    int b=strlen(a),c[40],ok[40];
    for(int i=b-1;i>=0;i--){
      if(a[i]>='0'&&a[i]<='9'){
        c[i]=a[i]-'0';
      }
      else if(a[i]>='A'&&a[i]<='F'){
        c[i]=a[i]-'A'+10;
      }
    }

    现在所有的字符,已经转成了对应的数字,c里面就是每一位对应的数字。

     然后我们把这个数转换成10进制的数。

    

    int j=0,sum=0,o=b-1;
    while(j<b){
      int d;
      d=pow(n,o);
      sum=sum+d*c[j];
      j++;
      o--;
    }

    然后我们再把10进制的数,转换成m进制的数。

    

    int y=0;
    while(sum!=0){
      ok[y]=sum%m;//用数组来记录每一位上的数
      sum/=m;
      y++;
     }

    最后,不要忘记把数组倒序输出。

    

    for(int i=y-1;i>=0;i--){
      if(ok[i]>=10){
        cout<<(char)(ok[i]+55);
      }
      if(ok[i]<10){
        cout<<ok[i];
      }
    }

    最后,贴上完整代码。

    

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    using namespace std;
    int main (){
      char a[10],l[40];
      int n,m;
      cin>>n>>a;
      cin>>m;
      int b=strlen(a),c[40],ok[40];
      for(int i=b-1;i>=0;i--){
        if(a[i]>='0'&&a[i]<='9'){
          c[i]=a[i]-'0';
        }
        else if(a[i]>='A'&&a[i]<='F'){
          c[i]=a[i]-'A'+10;
        }
      }
      int j=0,sum=0,o=b-1;
      while(j<b){
        int d;
        d=pow(n,o);
        sum=sum+d*c[j];
        j++;
        o--;
      }
      int y=0;
      while(sum!=0){
        ok[y]=sum%m;
        sum/=m;
        y++;
      }
      for(int i=y-1;i>=0;i--){
        if(ok[i]>=10){
          cout<<(char)(ok[i]+55);
        }
        if(ok[i]<10){
          cout<<ok[i];
        }
      }
      return 0;
    }

    完结撒花。

posted @ 2020-05-08 21:37  王佳琳  阅读(213)  评论(0编辑  收藏  举报