进制转换的普遍思路;
- 如果需要将一个p进制转换成q进制,需要将该p进制数转换成十进制数,以其为媒介转化成其他进制的数。
- 进制转换一般需要用到取余取低位,除法进行右移的操作。
1
分析
这是一道典型的进制转换类型的题,难点在于读取和输出的可能不是纯数字,会有‘A’,‘B’,
‘C’,'D’等字母。可以采用一次用scanf读取一个单词,然后逐字符转换成整型。输出时,需要将整型转换成字符。
#include<stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
char toChar(int);
int toNum(char);
int main()
{
const int MAX = sizeof(long) * 8; //long类型最多所占的位数
int D1,D2; //当前读取数字的进制数 待转换成的进制数
char input[MAX + 1]; //用于接收读入的数字
char result[MAX];
long num ;
int i,len,count;
while(scanf("%d%s%d",&D1,input,&D2) == 3){
num = 0;
count = 0;
len = (int)strlen(input);
for(i = 0;i < len;i++){
num += toNum(input[len- 1 -i] ) * pow(D1,i);
}
do{
result[count ++] = toChar(num % D2);
num /= D2;
}while (num);
for(i = count - 1;i >= 0;i--)
{
printf("%c",result[i]);
}
putchar('\n');
}
return 0;
}
char toChar(int num)
{
char ch;
switch (num)
{
case 10:
ch = 'A';
break;
case 11:
ch = 'B';
break;
case 12:
ch = 'C';
break;
case 13:
ch = 'D';
break;
case 14:
ch = 'E';
break;
case 15:
ch = 'F';
break;
default:
ch = num + '0';
}
return ch;
}
int toNum(char ch){
int num;
ch = toupper(ch);
switch (ch)
{
case 'A':
num = 10;
break;
case 'B':
num = 11;
break;
case 'C':
num = 12;
break;
case 'D':
num = 13;
break;
case 'E':
num = 14;
break;
case 'F':
num = 15;
break;
default:
num = ch - '0';
}
return num;
}
Tips
- 用到do while循环而不是while循环的原因是,假设输入的数据是0,那么while循环将不会进行,最后将什么也不会打印。do while保证了即使是0也会打印。