我们都知道转换进制是一个让人比较头疼的事情,下面我的代码不是最好的,也就仅仅是一个思路而已,至少我认为使用栈来进行进制转换是比较合适的一种方法,好了,不多叙述了。

#include<stdio.h>
#include<stdlib.h>
/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */
#define M sizeof(unsigned int)*8
int trans(unsigned n, int d, char s[])
{
    static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */
    char buf[M+1];
    int j, i = M;
    if(d<2||d>16)
    {
        s[0]='\0';  /* 不合理的进制,置s为空字符串 */
        return 0;   /* 不合理的进制,函数返回0 */
    }
    buf[i]='\0';
    do
    {
        buf[--i]=digits[n%d];   /*译出最低位,对应字符存入对应工作数组中*/
        n/=d;
    }while(n);
    /* 将译出在工作数组中的字符串复制到s */
    for(j=0;(s[j]=buf[i])!='\0';j++,i++);
        /* 其中控制条件可简写成s[j]=buf[i] */
    return j;
}
/* 主函数用于测试函数 trans() */
main()
{
    unsigned int num = 253;
    int scale[]={2,3,10,16,1};
    char str[33];
    int i;
    clrscr();
    for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++)
    {
        if(trans(num,scale[i],str))
            printf("%5d = %s(%d)\n",num,str,scale[i]);
        else
            printf("%5d => (%d) Error! \n",num,scale[i]);
    }
    printf("\n Press any key to quit...\n");
    getch();
}

下面我们来看看最为核心的一步,那就是获得余数的方式

do
    {
        buf[--i]=digits[n%d];   /*译出最低位,对应字符存入对应工作数组中*/
        n/=d;
    }while(n);

注意这里的buf[i–],便是为了使得目标数对进制数取余后的结果存入buf的尾部,这其实也是利用了栈的知识,此处我们可以把buf数组,看做是一个存储结构为顺序表的顺序栈,这样就可以直接获得转换过进制之后的一串数字了。避免了再次进行尾部获取的步骤。

总结:数据结构不是一套空泛的理论,它是一套灵活的解决问题的法宝,我们要多加思考,多加利用,来优化和改进我们的程序。这也是为什么”有时候优雅的实现,仅仅是需要一个函数,而这个函数必然联系着我们的数据结构“,最后希望我们能够共同进步吧。

C语言之任意进制的转换的更多相关文章

  1. python的十进制与任意进制的转换

    将任意进制转换成十进制 ", 8)) # 表示把8进制的54转换成十进制数并输出结果. # 8可以是2.8,10,16等进制数 将十进制转换成任意进制 def f(n,x): #n为待转换的 ...

  2. java 的任意进制间转换(很方便)

    import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = n ...

  3. java 的任意进制间转换

    直接上代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method st ...

  4. C#十进制与任意进制的转换

    /// <summary> /// 将十进制转换为指定的进制 /// </summary> /// <param name="Val">十进制值 ...

  5. C#实现整型数据字任意编码任意进制的转换和逆转换

    实现如下: using System; using System.Collections.Generic; using System.Linq; using System.Text;  namespa ...

  6. (高精度运算4.7.26)POJ 1220 NUMBER BASE CONVERSION(高精度数的任意进制的转换——方法:ba1----->10进制----->ba2)

    package com.njupt.acm; import java.math.BigInteger; import java.util.Scanner; public class POJ_1220_ ...

  7. icpc 银川 I. Base62 任意进制的转换 短除法

    Problem Description As we already know, base64 is a common binary-to-text encoding scheme. Here we d ...

  8. Python版任意进制转换

    def decimalToAny(num,n): baseStr = {10:"a",11:"b",12:"c",13:"d&qu ...

  9. itoa()、atoi()、任意进制转换

    头文件:<stdlib.h> itoa --功能:将任意类型的数字转换为字符串.在<stdlib.h>中与之有相反功能的函数是atoi. atoi----功 能: 将字符串转换 ...

随机推荐

  1. 解决问题redis问题:ERR Client sent AUTH, but no password is set

    是的,这又是一个坑爹的问题. 明明在redis.conf中设置了密码,而且redis还启动了,为什么说没有密码呢? 大家都知道linux下启动redis有很多种方法, 其中有 ./redis-serv ...

  2. python笔记五(条件判断/循环/break和continue)

    一 条件判断 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> ...

  3. hibernate5学习之理解数据库级并发

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50551741 当我们谈起隔离的时候,我们总是假定两个物体直接要么隔 ...

  4. MYSQL 更新时间自动同步与创建时间默认值共存问题

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50326259 在使用SQL的时候,希望在更新数据的时候自动填充更新 ...

  5. 剑指Offer——知识点储备-JVM基础

    剑指Offer--知识点储备-JVM基础 1.java内存与内存溢出 1.1 JVM分为哪些区,每一个区干嘛的?(见java虚拟机38页) (1)程序计数器(线程私有) 当前线程执行字节码的信号指示器 ...

  6. Android Multimedia框架总结(十七)音频开发基础知识

    请尊重分享成果,转载请注明出处,本文来自逆流的鱼yuiop,原文链接:http://blog.csdn.net/hejjunlin/article/details/53078828 近年来,唱吧,全民 ...

  7. nginx平台初识(一)

    众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧. nginx在启动后,在unix系统中会以daemon的方式 ...

  8. springmvc文件上传和拦截器

    文件上传 用到这两个包 配置视图解析器:springmvc配置文件配置 <!-- id必须要是"multipartResolver" --> <bean id=& ...

  9. Hibernate缓存集成IMDG

    1 第三方缓存插件 除了Ehcache这种轻量级的缓存方案外,几乎所有IMDG产品都提供了对Hibernate二级缓存的直接支持,常用的有: Ø  Hazelcast Ø  GridGain Ø  J ...

  10. JDBC-数据库的编程(一)

    因为我使用的mysql数据库客户端程序是workBench,所以会用workBench来进行讲解. create table tbl_user( id int(11) unsigned not nul ...