程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 遞歸 將一個十進制數轉化為任意進制數

遞歸 將一個十進制數轉化為任意進制數

編輯:C++入門知識

作者 : 卿笃軍


將一個十進制數轉化為任意進制數(2~16進制之間)~

C語言版:

#include 

//n:原數(10進制)  to:將轉換成的進制  buf:保存轉換後的進制數
void fn(int n, int to, char *buf)
{
	//將i定義為靜態的目的:為了在多層遞歸裡面使用的是同一個i值
	static int i = 0; 

	//特殊情況0,獨立出來處理
	if (n == 0)   
	{
		buf[i] = '0';
		return;
	}

	//對於負數的預處理
	if (n < 0)    
	{
		buf[i] = '-';
		++i;
		n = -n;
	}

	//正整數遞歸,進行進制轉換.
	if (n != 0)   
	{
		//遞歸入棧
		fn(n/to,to,buf);
		//遞歸彈棧
		switch(n%to)
		{
		case 15: buf[i] = 'F'; break;
		case 14: buf[i] = 'E'; break;
		case 13: buf[i] = 'D'; break;
		case 12: buf[i] = 'C'; break;
		case 11: buf[i] = 'B'; break;
		case 10: buf[i] = 'A'; break;
		default: buf[i] = (n%to+'0'); break;
		}
		++i;
	}
}

int main()
{
	char buf[50] = "";
	int n, to;

	scanf("%d%d",&n,&to);
	//進制轉換
	fn(n,to,buf);

	puts(buf);

	return 0;
}
C++版,優化了一下程序,精簡了一些代碼~~~

原來我一直以為static 定義數據類型的時候,右值必須是一個const值,當然,我當初在C環境下測試的時候也是這樣的。

示例:

1)static int a = 0;

2)static int a = (1 == 2)? 1 : 3; ×

不過,今天看到同學寫第二種形式,竟然也是對的。後來問了一下,原來是.cpp後綴。

遞歸的時候,將一些執行語句放入static 裡面,由於static語句只執行一次,在裡面放入一些,只需要執行一次的語句再好不過了~~~~

下面代碼,請在.cpp 文件下面執行,.c會報錯~~~

#include 

//n:原數(10進制)  to:將轉換成的進制 
char *fn(int n, int to)
{
	//定義靜態變量的目的:為了在多層遞歸裡面使用的是同一個值,且static只執行一次
	static char buf[100] = "", BinHex[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	//進行n == 0 和 n < 0 的情況處理,static只執行一次
	static int i = (n >= 0) ? (buf[0] = '0',0) : (buf[0] = '-',n = -n,1);  

	//正整數遞歸,進行進制轉換.
	if (n != 0)   
	{
		//遞歸入棧
		fn(n/to,to);
		//遞歸彈棧
		buf[i++] = BinHex[n%to];
	}
	return buf;
}

int main()
{
	char *buf = NULL;
	int n, to;

	//輸入n:原數據   to:需要轉化成的進制
	scanf("%d%d",&n,&to);  
	//進制轉換
	buf = fn(n,to);

	puts(buf);

	return 0;
}
當然,上述代碼,沒有對超過16進制和小於2進制的時候進行處理~~~~


參考文獻:SnailSet的博客專欄,將十進制整數轉換成b進制字符串 (遞歸和非遞歸實現),http://blog.csdn.net/snailset/article/details/26492715


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved