原题:洛谷P1143
输入:共三行。
第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16)n(2≤n≤16);
第二行是一个n进制数,若n>10n>10则用大写字母A−FA−F表示数码10−1510−15,并且该n进制数对应的十进制的值不超过1000000000;
第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)m(2≤m≤16)。
输出:一个正整数,表示转换之后的m进制数。
思路:先将该数字转为十进制数,再将十进制数转为题目所求进制下的数。
代码:
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
int a[100],num1,num2;
int out1=0;
char str[100],str2[100];
int decimal(int x);
int change(int y,int out);
int main(){
//输入原来的进制及其数字,转换后的进制
cin>>num1>>str>>num2;
//先转为十进制
out1=decimal(num1);
//十进制:cout<<out1<<endl;
change(num2,out1);
return 0;
};
int decimal(int x){
int lena=strlen(str);
//将输入的字符串转为数字存入数组
for(int i=0;i<lena;i++){
if(str[i]=='A')a[i]=10;
else if(str[i]=='B')a[i]=11;
else if(str[i]=='C')a[i]=12;
else if(str[i]=='D')a[i]=13;
else if(str[i]=='E')a[i]=14;
else if(str[i]=='F')a[i]=15;
else a[i]=str[i]-'0';
out1+=a[i]*pow(x,lena-i-1);
}
return out1;
};
int change(int y,int out){
int rest=0,i=0,len=0;
while(out!=0||rest!=0){
rest=out%y;
out/=y;
i++;
len++;
if(rest==10)str2[i]='A';
else if(rest==11)str2[i]='B';
else if(rest==12)str2[i]='C';
else if(rest==13)str2[i]='D';
else if(rest==14)str2[i]='E';
else if(rest==15)str2[i]='F';
else {
//若是小于10的数字,则利用ascii码
str2[i]='40';
str2[i]+=rest;
}
};
//删去先导0
if('0'==str2[len]&&len>0)len--;
//输出结果
for(i=len;i>=0;i--)cout<<str2[i];
}
这篇博客详细介绍了如何实现一个将任意进制数字转换为另一种进制的算法。首先,通过输入的原始进制和数字,将其转换为十进制数。然后,将得到的十进制数转换为目标进制,输出转换后的结果。代码中包含关键函数`decimal`用于将输入的n进制数转换为十进制,`change`函数则将十进制数转换为m进制。整个过程清晰地展示了进制转换的步骤。
1286

被折叠的 条评论
为什么被折叠?



