初级系列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.

posted @ 2019-09-08 10:14  电院院长  阅读(304)  评论(0编辑  收藏  举报