思路:
第一步: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;
}