进制转换
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n(2≤n≤16) n(2≤n≤16),第二行是一个n进制数,若 n > 10 n>10 n>10则用大写字母 A − F A-F A−F表示数码 10 − 15 10-15 10−15,并且该 n n n进制数对应的十进制的值不超过 1000000000 1000000000 1000000000,第三行也是一个正整数,表示转换之后的数的进制 m ( 2 ≤ m ≤ 16 ) m(2≤m≤16) m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的 m m m进制数。
样例 #1
样例输入 #1
16
FF
2
样例输出 #1
11111111
思路
首先想到的是将各个进制的数都转化为10进制。
用2进制转10进制举例1011转化为10进制就等于 1x23+0x22+1x21+1x20=11;
转化为代码就是:
for(int i=0;i<s.length();i++)//先转化为10进制
{
if(s[i]<'A')
{
temp=pow(n,s.length()-i-1);
temp*=(s[i]-'0');
sum+=temp;
}else{
temp=pow(n,s.length()-i-1);
temp*=(s[i]-'A'+10);//A在16进制中为10
sum+=temp;//sum即为转化完成的10进制数字
}
}
接着就是把10进制的数字 转化为各个进制的数字
假如将10进制的数字转化为2进制的数字.
接着用上面的11来
先将11/2得到5余数为1;
然后5/2得到2余数为1;
接着2/2得到1余数为0;
最后1/2得到0余数为1;
我们就可以发现 余数倒过来上去得到的1011就是我们要的答案
这里我用的是将他们存储在一个arr数组中.
while(sum>0)
{
arr[cnt++]=sum%m;
sum/=m;
}
最后将他们倒序输出就好了
以下是AC代码
#include<bits/stdc++.h>
using namespace std;
int arr[10000000];//用来存储最终答案
int cnt=0;//为最终答案位数计数
int main()
{
int n,m;//将n进制的数转化为m进制的数
string s;//n进制的数
cin>>n>>s>>m;
int temp,sum=0;
for(int i=0;i<s.length();i++)//先转化为10进制
{
if(s[i]<'A')
{
temp=pow(n,s.length()-i-1);
temp*=(s[i]-'0');
sum+=temp;
}else{
temp=pow(n,s.length()-i-1);
temp*=(s[i]-'A'+10);//A在16进制中为10
sum+=temp;
}
}
while(sum>0)
{
arr[cnt++]=sum%m;
sum/=m;
}
for(int i=cnt-1;i>=0;i--)
{
if(arr[i]>=10)
{
printf("%c",arr[i]+'A'-10);
}else{
cout<<arr[i];
}
}
return 0;
}