#本人大一软件工程在读,妥妥的小菜鸟一枚,以下仅是我自己的学习心得,用来整理笔记用的,要是有什么错误,跪请各位大佬指正!!!🙏🙏🙏#
描述
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
输入
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。
a,b是十进制整数,2 =< a,b <= 16。
输出
输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
解答:
我个人喜欢先把整体框架搭出来,最后填补细节。就比如这题,当务之急是搞清楚进制的转化方法,因此现将n转化成10进制数,一位一位的累加,再用短除法将10进制数转化成b进制数。
再考虑一下ABCDEF的表示问题,将a进制数n用ASCII码和其他正常数字写在数组里去,再用switch把ABCDEF表示成10、11、12、13、14、15(最后把A和a的判断加进去)。
输出b进制数时,用短除法把余数(其实就是新数的各位)放进数组,然后再一个一个翻译打印(这里指的翻译,就是10、11、12、13、14、15转化成ABCDEF)。
代码如下:
#include <stdio.h>
#include <string.h>
int main(){
int a,b,num,len,i,mid,ch,t=0;
int n2[100]={0};
char n[100]={0};
char out[100];
scanf("%d%s%d", &a, n, &b);
len=strlen(n);
for(i=0;i<len;i++){
n2[i]=n[i]-'0';
}
for(i=len-1,mid=1;i>=0;i--){
t=n2[i];
switch(t){
case 17:
case 49:
n2[i]=10;
break;
case 18:
case 50:
n2[i]=11;
break;
case 19:
case 51:
n2[i]=12;
break;
case 20:
case 52:
n2[i]=13;
break;
case 21:
case 53:
n2[i]=14;
break;
case 22:
case 54:
n2[i]=15;
break;
default:
break;
}
ch=n2[i]*mid+ch;
mid=mid*a;
}
for(i=0;ch!=0;i++){
out[i]=ch%b;
ch=ch/b;
}
for(i=i-1;i>=0;i--){
t=out[i];
switch(t){
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
default:
printf("%d",out[i]);
}
}
}
我依然迷惑为什么系统说我是错的,但是我自己尝试了我几组数据都是对的,OJ看不到答案,我哭了😭