思路:
第一步:n进制数转化为10进制
第二步:10进制数转化为m进制
第一种方法,用映射来解决(推荐)
#include<iostream>
#include<string>
#include<map>
#include<cmath>
using namespace std;
map<char,int>num1;//字符对应数字
map<int,char>num2;//数字对应字符
int n,m;
string s,ts;
int num=0;//存放转化后的十进制
void mp(){//预处理
for(int i=0;i<10;i++){//处理十以下的
num1[i+'0']=i;
num2[i]=i+'0';
}
for(int i='A';i<='F';i++){//处理十以上的
num1[i]=i-'A'+10;
num2[i-'A'+10]=i;
}
}
void jz_10(){//转化为十进制
int len=s.length();
for(int i=0;i<len;i++){
num+=num1[s[len-i-1]]*pow(n,i);
}
}
void jz10_(){//十进制转化为其他进制
while(num){
ts+=num2[num%m];
num/=m;
}
}
int main(){
mp();//映射预处理
cin>>n,cin>>s,cin>>m;
jz_10();//转化为十进制
jz10_();//十进制转化为其他进制
for(int i=ts.length()-1;i>=0;i--){
cout<<ts[i];
}cout<<endl;
return 0;
}
第二种方法,常规解法
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
string s;
string s2;
int mm;
int fun(int n){//大于是的字符转化为数字表示
switch(n){
case 'A':{
return 10;
break;
}
case 'B':{
return 11;
break;
}
case 'C':{
return 12;
break;
}
case 'D':{
return 13;
break;
}
case 'E':{
return 14;
break;
}
case 'F':{
return 15;
break;
}
}
}
int jz_shi1(){//任意进制转化为十进制转换为十进制
int sum=0;
int len=s.length();
for(int i=0;i<len;i++){
if(s[len-i-1]>='0'&&s[len-i-1]<='9'){
sum+=(s[len-i-1]-'0')*pow(n,i);
} else{
sum+=fun(s[len-i-1])*pow(n,i);
}
}
return sum;
}
int jz_shi2(){//十进制字符转化为数字
int sum=0;
for(int i=0;i<s.length();i++){
sum+=s[i]-'0';
sum*=10;
}
return sum/10;
}
void jzshi(){//预处理为十进制
if(n!=10){
mm=jz_shi1();
}else{
mm=jz_shi2();
}
}
char jz_shi4(int n){//大于10的数字转化为字符
switch(n){
case 10:{
return 'A';
break;
}
case 11:{
return 'B';
break;
}
case 12:{
return 'C';
break;
}
case 13:{
return 'D';
break;
}
case 14:{
return 'E';
break;
}
case 15:{
return 'F';
break;
}
}
}
void jz_shi3(){//转化为对应的进制
while(mm){
int mr;
while(mm){
mr=mm%m;
if(mr>=0&&mr<=9){
s2+=mr+'0';
}else{
s2+=jz_shi4(mr);
}
mm/=m;
}
}
}
int main(){}//主函数
cin>>n;
cin>>s;
cin>>m;
if(n==m){//当输入输出进制相等时
cout<<s;
return 0;
}
jzshi();//预处理任何输入转化为十进制
//下面对mm十进制数进行转化
//cout<<mm<<endl;
jz_shi3();//十进制转化为m进制
for(int i=s2.length()-1;i>=0;i--){
cout<<s2[i];
}cout<<endl;
return 0;
}