無符號十進制整數轉換成任意進制數


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM