zoukankan      html  css  js  c++  java
  • 初级系列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:
    ");
            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] != ''; 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] = '';
        return i;
    }
    
    void output(char tmp[], int length)
    {
        int i;
        for (i = length - 1; i >= 0; i--) {
            printf("%c", tmp[i]);
        }
        printf("
    ");
    }
    
    /* !<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.
    

  • 相关阅读:
    共享无法访问问题,通过ip地址或者主机名无法访问目的主机
    开机系统更新,一直停在?%处,无法进入系统
    win7电脑访问内网地址报错0x800704cf,0x80070035解决方法
    电脑共享--问题汇总
    win10域账户用户时间无法和域服务器同步
    卸载WPS后,原office出现各种问题,报错,图标混乱
    局域网新装电脑主机网络断断连连解决方案
    win10主机无法进入本地共享,“没有权限”
    win10安装部分软件报错“应用程序无法启动,应用程序并行配置不正确,或使用命令行sxstrace.exe”
    【日常修机】打印机故障维护
  • 原文地址:https://www.cnblogs.com/xzpin/p/11484543.html
Copyright © 2011-2022 走看看