洛谷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;
}
完结撒花。