注意:AC代码在最后,需要自取
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 (2≤n≤16),第二行是一个 n 进制数,若 n>10 则用大写字母 A∼F 表示数码 10∼15,并且该 n 进制数对应的十进制的值不超过 10的九次方 ,第三行也是一个正整数,表示转换之后的数的进制 m (2≤m≤16)。
输出格式
一个正整数,表示转换之后的 m 进制数。
输入输出样例
输入 #1
16
FF
2
输出 #1
11111111
题目分析
这道题就是最基础的进制转换,我的思路是先把n进制数转换为10进制数,再把这个10进制数转换为m进制数。
例如,16进制的FF先转换为10进制的255,再转换为2进制的11111111。
思路
首先我们先写出n进制数转换为10进制的代码:
#include<iostream>
using namespace std;
int main()
{
int n1,n2,z=0,i,a=1,e;
string n,g;
cin>>n1>>n>>n2;
for(i=n.size()-1;i>=0;i--)//从后往前判断
{
if(n[i]>='A'&&n[i]<='F')//判断是否为字母
{
z+=(n[i]-'A'+10)*a;//将字符转数字
a=a*n1;
}
else if(n[i]>='0'&&n[i]<='9')//判断是否为数字
{
z+=(n[i]-'0')*a;//将字符转数字
a=a*n1;
}
}
这里我用z把十进制的数存下来,一定要注意字母转数字是n[i]-'A'+10,不要忘记加10,或者你也可以写你n[i]-55。
紧接着我们就开始10进制转m进制,我这里用了一个while循环:
while(z>0)//g,str都是string类型的
{
e=z%n2; //这步可以算出转换后每一位上的数
if(e<10) g='0'+e;//判断是否转换为字母
else g=e-10+'A';
str=g+str;//将每次的数字或字母加到字符串中
z/=n2;//z的值每次要除m
}
cout<<str;//输出
可能有人看不懂z为什么要除m(代码中为n2),下面的图可以解释:
可以看到,10进制转2进制时每此都除了2,后面则有余数(代码中用e存储),因为255(存的10进制数)是int类型,所以除2后只保留整数部分,所以就是z除m。
随后将两部分结合后,轻松AC。
AC代码:
#include<iostream>
using namespace std;
int main()
{
int n1,n2,z=0,i,a=1,e;
string n,g,str;
cin>>n1>>n>>n2;
for(i=n.size()-1;i>=0;i--)
{
if(n[i]>='A'&&n[i]<='F')
{
z+=(n[i]-'A'+10)*a;
a=a*n1;
}
else if(n[i]>='0'&&n[i]<='9')
{
z+=(n[i]-'0')*a;
a=a*n1;
}
}
while(z>0)
{
e=z%n2;
if(e<10) g='0'+e;
else g=e-10+'A';
str=g+str;
z/=n2;
}
cout<<str;
return 0;
}