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