题目:将一个无符号整数转换为任意 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语言里,这是一个必须得留心的问题,而且如果程序很大的话,会很难发现的,所以在这里提个醒。