#include <stdio.h>
#include <string.h>
void main(){
int input, output, i = 0, j = 0, integer = 0, position = 0, length_of_integer = 0, decimal_integer = 0;
double decimal = 0;
char origin[51] = {0}, final[51] = {0};
printf("请输入原数据的进制类型:\n");
scanf("%d", &input);
printf("请输入你要转换的数据:\n");
scanf("%s", origin);
printf("请输入你要转换成的进制类型:\n");
scanf("%d", &output);
printf("转换成的%d进制数为:\n", output);
while(origin[position] != '.' && position < 50){
position++;
}
if(origin[position] == '.'){
for(i = 0; i < position; i++){
integer = integer*input;
if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
integer = integer + (origin[i] - 'A' + 10);
}
else{
integer = integer + (origin[i] - '0');
}
}
for(i = strlen(origin) - 1; i > position; i--){
if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
decimal = decimal + (origin[i] - 'A' + 10);
}
else{
decimal = decimal + (origin[i] - '0');
}
decimal = decimal/input;
}
}
else{
for(i = 0; i < strlen(origin); i++){
integer = integer*input;
if(origin[i]=='A' || origin[i]=='B' || origin[i]=='C' || origin[i]=='D' || origin[i]=='E' || origin[i]=='F'){
integer = integer + (origin[i] - 'A' + 10);
}
else{
integer = integer + (origin[i] - '0');
}
}
}
if(integer == 0){
final[j] = '0';
j++;
length_of_integer++;
}
while(integer){
if(integer%output > 9){
final[j] = 'A' - 10 + integer%output;
}
else{
final[j] = integer%output + '0';
}
integer = integer/output;
j++;
length_of_integer++;
}
while(j <= 50 && decimal != 0.0){
decimal_integer = decimal*output;
if(decimal*output > 9){
final[j] = 'A' - 10 + decimal_integer;
}
else{
final[j] = decimal_integer + '0';
}
decimal = decimal*output - decimal_integer;
j++;
}
for(i = length_of_integer - 1; i >= 0; i--){
printf("%c", final[i]);
}
if(origin[position] == '.'){
printf(".");
for(i = length_of_integer; i < j; i++){
printf("%c", final[i]);
}
}
}
- 总体思路:先将其他进制数据转化为十进制,再将数据转化为其他进制,间接实现任意进制之间的转换。
- 在转换过程中,以小数点为界限,分隔整数和小数。
- 为了便于输入输出,采取字符串的形式。
- 对于整数部分,如果是k进制的数,化成10进制,则从最高位开始,不断×k,最高位实现累乘,能够得到每一位都×自己对应的次数。注意:最低位×k^0即1,故要在循环中,先写integer = integer * input(参考代码第24行)。而10进制的整数化为m进制,则不断进行求余和除法运算,实现余数的收集,然后倒序排列,即为m进制的整数部分。(实际上是k进制化为10进制的逆运算)。
- 对于小数部分,请注意:小数的k进制化为10进制,需要从最低位开始不断÷k,从而实现每位小数都÷相应的k次方,实现小数部分化为10进制小数,需要注意的是,最高位小数÷k^1,故要在循环中,后写decimal = decimal / output(参考代码第40行)。而当十进制小数化为m进制小数时,需要不断进行×m取整,原因是,m进制小数的每一位÷相应位数的m次方得到10进制小数,那么想要得到m进制小数的每一位,就要×m不断取整得到(两者其实互为逆运算)。
- 最后看好整数部分和小数部分所占据的输出数组的位置输出即可,注意在其中间单独输出一个小数点即可。