1、问题:
给定一个M进制的数x,实现对x向任意的一个非M进制的数的转换。
2、问题分析
几种不同的转换方向:
- 二进制、八进制、十六进制向十进制转换:按权展开相加。
- 十进制向二进制、八进制、十六进制转换:整数部分除以基数取余数(取余的方向从后往前);小数部分乘以基数取整数(取整从前往后)
- 二进制、八进制、十六进制相互转化:全部转化为十进制,然后按照其对应关系转化。
3、算法设计
将输入的任何数字和字母存到字符数组中,然后在进行转化,在数组元素进行数制转换时又以数值的形式存在,所以涉及的字符与数字的相互转换。
下面讲一下具体函数的编写。
1、数字与字符的相互转换
int char_to_num(char ch)//字符向数字转换
{
if(ch >= '0' && ch <= '9')
return ch - '0';
else
return ch - 'A' + 10;
}
char num_to_char(int num)//数字向字符转换
{
if(num >= 0 && num <= 9)
return(char)('0' + num - 0);
else
return(char)('A' + num - 10);
}
2、其他数制转化为十进制
字符由键盘输入,每次输入的字符串可能不同,也可能达不到最大的字符个数,所以要先确定字符数组中有效字符的个数。
for(i = 0; temp[i] != '\0';i++);
count = i;//得到有效字符的个数
long source_to_decimal(char temp[],int source)
{
long decimal_num = 0;
int length;
int i;
for(i = 0; temp[i] != '\0';
length = i;
for(i = 0; i < length - 1; i++)
{
deciaml_num = (decimal_num *source) + char_to_num(temp[i]);
}
return decimal_num;
}
3、十进制转化其他的数制
int deciaml_to_object(char temp[],long decimal_num,int object)
{
int i = 0;
while(decimal_num)
{
temp[i] = num_to_char(decimal % object);
decimal_num = decimal_num / object;
i++;
}
temp[i] = '\0';
return i;
}
4、逆序输出。
由于余数组成的新制数与余数的方向相反
void output(char temp[],int length)
{
int i;
for(i = length - 1; i >= 0; i--)
printf("%c",temp[i]);
printf("\n");
}
完整代码
#include <stdio.h>
#define MAXCHAR 101
int char_to_num(char ch)
{
if(ch >= '0' && ch <= '9')
{
return ch - '0';
}
else
{
return ch - 'A' + 10;
}
}
char num_to_char(int num)
{
if(num >= 0 && num <= 9)
{
return (char)('0' + num - 0);
}
else
{
return (char)('A' + num - 10);
}
}
long source_to_decimal(char temp[],int source)
{
long decimal_num = 0;
int length;
int i;
for(i = 0; temp[i] != '\0'; i++ );
length = i;
for(i = 0; i <= length - 1; i++)
{
decimal_num = (decimal_num * source) + char_to_num(temp[i]);
}
return decimal_num;
}
int decimal_to_object(char temp[],long decimal_num,int object)
{
int i = 0;
while(decimal_num)
{
temp[i] = num_to_char(decimal_num % object);
decimal_num = decimal_num / object;
i++;
}
temp[i] = '\0';
return i;
}
void output(char temp[],int length)
{
int i;
for(i = length - 1; i >= 0; i--)
{
printf("%c",temp[i]);
}
printf("\n");
}
int main()
{
int source;
int object;
int length;
long decimal_num;
char temp[MAXCHAR];
int flag = 1;
while(flag)
{
printf("转换之前的数:");
scanf("%s",temp);
printf("转换之前的数制:");
scanf("%d",&source);
printf("转换之后的数制:");
scanf("%d",&object);
printf("转换之后的数");
decimal_num = source_to_decimal(temp,source);
length = decimal_to_object(temp,decimal_num,object);
output(temp,length);
printf("继续请输入1,否则输入0:\n");
scanf("%d",&flag);
}
return 0;
}