无符号十进制整数转换成任意进制数

题目:将一个无符号整数转换为任意 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] = '\0';
}

/* 将转换的数组倒置 */
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] = '\0';
}

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", n, dst, d);
	}

	return 0;
}

结果运行如下:


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

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

posted on 2015-01-23 12:01  fusae  阅读(3056)  评论(0编辑  收藏  举报

导航