P1143 进制转换

这个题说的就是给你一个n进制的数,转成m进制,这题相对来说是很简单的,不过我写的代码又臭又长( ̄▽ ̄)"

我想到的方法是把n进制转为十进制,再将十进制转为m进制

用样例来解释吧,要将十六进制的FF转为二进制

先将FF转为十进制,F在十六进制里代表的是15

个位的F代表15个1

十位的F代表15个16

FF的十进制就是15*1+15*16,结果是255

再将255转为二进制

对255进行取余,结果是1,再将255/2,结果是127

对127进行取余,结果是1,再将127/2,结果是63

对63进行取余,结果是1,再将63/2,结果是31

……

结果是11111111,这样就把FF的二进制求出来了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s;
int m,n,x=1,a,o[100];
int main()
{
    cin>>m;
    cin>>s;
    cin>>n;
    for(int i=s.length()-1;i>=0;i--)//这里注意要倒过来,不然数字就反了
       {
        if(s[i]=='A'){
            a+=10*x;
        }
        else if(s[i]=='B'){
            a+=11*x;
        }
        else if(s[i]=='C'){
            a+=12*x;
        }
        else if(s[i]=='D'){
            a+=13*x;
        }
        else if(s[i]=='E'){
            a+=14*x;
        }
        else if(s[i]=='F'){
            a+=15*x;//十六进制的数会出现字母,这部分就是把字母转换成数字
        }
        else{
            a+=(s[i]-'0')*x;
        }
        x*=m;
    }//这里把n进制转成十进制
    x=0;
    while(a!=0)
    {
        o[x++]=a%n;//要倒这输出,存入数组会简便一些
        a/=n;//这是把十进制转成m进制
    }
    for(int i=x-1;i>=0;i--)
    {
        if(o[i]==10)
        {
            cout<<'A';
        }
        else if(o[i]==11)
        {
            cout<<'B';
        }
        else if(o[i]==12)
        {
            cout<<'C';
        }
        else if(o[i]==13)
        {
            cout<<'D';
        }
        else if(o[i]==14)
        {
            cout<<'E';
        }
        else if(o[i]==15)
        {
            cout<<'F';
        }//如果输出的数是十六进制,就要把数字改为字母输出
        else
        {
            cout<<o[i];
        }
    }
    return 0;
}

这样就愉快的AC了(个人意见,不喜勿喷)!

原文地址:https://www.cnblogs.com/zjylzf/p/12848830.html