zoukankan      html  css  js  c++  java
  • 无符号十进制整数转换成任意进制数

    题目:将一个无符号整数转换为任意 d 进制数( 2 ≤ d ≤ 16 )。

    思路:先举个例子。十进制100怎么转换为二进制呢?

    记住:d进制的数就是0~(d-1)。

    一般都是用辗转相除法(应该是叫这个名字),我比较喜欢这样写,比较直观:

    `


    这样我们就很清楚地知道是一直在除以2,直至被除数为0。

    我们就将余数储存在一个数组里,到时候再将数组逆序输出,则100的二进制数1100100就能得到!

    其它进制也一样,不过是除数改变而已。

    所以步骤就是:

    1.将余数储存在数组里

    2.将数组倒置

    3.输出数组


    下面给出代码:

    /* 实现十进制转换任意进制 */
    #include <stdio.h>
    #include <string.h>
    
    #define MAX sizeof(unsigned)*8 - 1
    
    /* 将十进制n转换成d进制 */
    void trans(unsigned n, int d, char srt[])
    {
    	char	*a = "0123456789ABCDEF";
    	int	i = 0;
    
    	while (1)
    	{
    		srt[i++] = a[n%d];
    		n = n / d;
    		if (n == 0)
    			break;
    	}
    	srt[i] = '';
    }
    
    /* 将转换的数组倒置 */
    void reversion(char srt[], char dst[])
    {
    	int	i = 0;
    	int	j, k;
    	j = k = strlen(srt);
    
    	while (1)
    	{
    		dst[i] = srt[--j];
    		
    		if (i == k - 1)
    			break;
    		i++;
    	}
    	dst[k] = '';
    }
    
    int main(void)
    {
    	int	n;
    	int	d;
    	char	srt[MAX];
    	char	dst[MAX];
    
    	printf("Please input a nuber:");
    	scanf("%d", &n);
    
    	for(d = 2; d <= 16; d++)
    	{
    		trans(n, d, srt);
    		reversion(srt, dst);
    		printf("%5d = %s<%d>
    ", n, dst, d);
    	}
    
    	return 0;
    }

    结果运行如下:


    虽然这个程序还有很多地方可以优化,但总体思路应该明确了。

    值得注意的是:一开始我写出来的时候运行结果却不正确,然后我仔细地看了一下代码才发现原来字符串数组后没有加上''!在C语言里,这是一个必须得留心的问题,而且如果程序很大的话,会很难发现的,所以在这里提个醒。

  • 相关阅读:
    C# 异步锁
    C#异步编程基础入门总结
    C#异步编程基础入门总结
    C#与数据结构--图的遍历
    C#中IEumerable的简单了解
    C# prism 框架 MVVM框架 Prism系列之事件聚合器
    .NET Core 3 WPF MVVM框架 Prism系列之对话框服务
    C# prism 框架
    TaskAwaiter<TResult> 结构
    利用Eventlog Analyzer分析日志
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4256793.html
Copyright © 2011-2022 走看看