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

#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. Errors occurred during the build. Errors running builder 'JavaScript Validator' on project '项目名'.

    把JavaScript Validator去掉.去掉的方法是:选择一个项目--右键Properties--Builders(排第二)--点一下右侧会有四项--取消第一项"JavaScript ...

  2. 使用kprobes查看内核内部信息

    前言:使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低.以内核模块的方式使用kprobes.jprobes,就可以在任意地址插入侦测器, ...

  3. Cassandra Secondary Index 介绍

    摘要 本文主要介绍cassandra中的索引,物化视图,有些知识点需要对cassandra有基本的认识才能理解.比如数据在cassandra节点中如何分布.如果有不明白的地方可以看本专栏之前文章.或者 ...

  4. Findbug在项目中的运用--提高代码质量

     FindBugs是一个静态分析工具,它检查类或者 JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题.有了静态分析工具,就可以在不实际运行程序的情况对软件进行分析 第一 手动安装 在Ec ...

  5. CSDN帐号被封

    感慨

  6. socket系列之客户端socket——Socket类

    假设TCP套接字服务器端已经建立好并正在监听客户端的连接了,那么客户端就可以通过Socket类来发起连接.客户端发起一个连接请求后,就被动地在等待服务器的响应.这个类同样位于java.net包中,包含 ...

  7. UNIX网络编程——tcp流协议产生的粘包问题和解决方案

    我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体 ...

  8. 返回present的根

    //返回四大tab页面 + (void)gobackToTabarController { UINavigationController* selectedTabNavController = (UI ...

  9. Mac下hosts文件配置

    工作中总会因为莫名其妙的原因,比如Mac下面打不开某网站,但是在windows 7下面却可以,此时只需两步即可完成在Mac下面上网.在Windows下面Win+R,输入cmd,进入命令行,将在wind ...

  10. Linux Debugging(八): core真的那么难以追踪吗?

    本周遇到了好几个core都很有典型性.在这里和大家分享下. 相信有过Linux编程经验的人,肯定都遇到过.感觉周围人很多对core有天然的恐惧感,尤其对刚入行不久的同学来说.当然了,也有工作好几年看到 ...