这个题说的就是给你一个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了(个人意见,不喜勿喷)!