初级系列10.数制转换
数制转换
问题描述
给定一个M进制的数x,实现对x向任意的一个非M进制的数的转换
问题分析
掌握不同数制间的转换关系是解决问题的关键,这里所说的数制一般包括二进制,八进制,十六进制及十进制
基数,权的概念
数制转换方法:
<1> 二,八 十六进制向十进制转换 按权展开相加
<2> 十进制转换成二进制,八进制,十六进制
整数部分:除以基数取余数,(取余的方向为从后向前)
小数部分:乘以基数取整数,(取整的方向为从前向后)
<3> 二进制,八进制,十六进制相互转换 先转换成十进制再转换成其它进制 or 按照其对应关系进行转换(三 位二进制数对应一位八进制数,四位二进制数对应一位十六进制数)
算法设计
<1> 十六进制是由0-F这一组固定的数字来表示,所以采用字符数组进行存储
<2> 在进行输入输出时数组元素都是以字符形式存在的,但是在进行数制转换时数组元素又以数值
形式存在number_to_char来实现字符与其对应数值之间的转换
#include <stdio.h>
#define MAXCHAR 101 /* !< 最大允许字符串长度 */
int char_to_num(char ch); /* !< 返回字符对应的数字 */
char num_to_char(int num); /* !< 返回数字对应的字符 */
long source_to_decimal(char tmp[], int source); /* !< 返回由原数转换成的10进制数 */
int decimal_to_object(char tmp[], long decimal_num, int object); /* !< 返回转换成目标数制后字符数组的长度*/
void output(char tmp[], int length); /* !< 将字符数组逆序打印 */
int main(void)
{
int source; /* !<存储原数制*/
int object; /* !<存储目标数制*/
int length; /* !<存储转换成目标数制后字符数组的长度*/
long decimal_num; /* !<存储转换成的10进制数*/
char tmp[MAXCHAR]; /* !<存储待转换的数值和转换后的数值*/
int flag = 1; /* !<存储是否退出程序的标志*/
while (flag) {
printf("转换前的数是:");
scanf("%s", tmp);
printf("转换前的数制是:");
scanf("%d", &source);
printf("转换后的数制是:");
scanf("%d", &object);
printf("转换后的数是:");
decimal_num = source_to_decimal(tmp,source);
length = decimal_to_object(tmp,decimal_num,object);
output(tmp, length);
printf("继续请输入 1, 否则输入0:\n");
scanf("%d", &flag);
}
}
/*将字符转换成数字*/
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); /* !<将0-9之间的数字转换成字符*/
}
else {
return (char)('A'+num-10); /* !<将大于10的数字转换成字符*/
}
}
long source_to_decimal(char tmp[], int source)
{
long decimal_num = 0; /* !< 存储展开之后的和*/
int length;
int i;
for (i = 0; tmp[i] != '\0'; i++) {
length = i;
}
for (i = 0; i <= length; i++) {/* !< 累加 */
decimal_num = (decimal_num*source) + char_to_num(tmp[i]);
}
return decimal_num;
}
int decimal_to_object(char tmp[], long decimal_num,int object)
{
int i = 0;
while (decimal_num) {
tmp[i] = num_to_char(decimal_num % object); /* !< 求出余数并转换为字符 */
decimal_num = decimal_num / object; /* !< 用十进制除以基数 */
i++;
}
tmp[i] = '\0';
return i;
}
void output(char tmp[], int length)
{
int i;
for (i = length - 1; i >= 0; i--) {
printf("%c", tmp[i]);
}
printf("\n");
}
/* !<output */
转换前的数是:15
转换前的数制是:16
转换后的数制是:10
转换后的数是:21
继续请输入 1, 否则输入0:
1
转换前的数是:10
转换前的数制是:8
转换后的数制是:16
转换后的数是:8
继续请输入 1, 否则输入0:
1
转换前的数是:85
转换前的数制是:10
转换后的数制是:8
转换后的数是:125
继续请输入 1, 否则输入0:
0
Process returned 0 (0x0) execution time : 61.844 s
Press any key to continue.