題目:將一個無符號整數轉換為任意 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語言里,這是一個必須得留心的問題,而且如果程序很大的話,會很難發現的,所以在這里提個醒。
