遞迴
一:題目1
將非負十進位制整數n轉換成b進製。(其中b = 2~16)
二:題目分析
將十進位制n轉換成任意進製b的方法是:n除以b取餘作為轉換後的數的最低位,在商不為0的情況下,則商繼續除以b,取餘作為次低位,直到商為0為止。
思想:
·將十六進製制的表示形式,即'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'
以字元的形式儲存在字元陣列s[16]中;
·同時定義乙個存放轉換後結果的陣列num[20];將n%b的結果儲存在num陣列中(方法是:num[i++] = s[n%b];n%b的結果正好對應著它在陣列s中的位置,然後將s陣列的值賦給num陣列,這樣就完成了結果的儲存);
·最後將結果輸出即可。
遞迴模型:
transform(0,b);(n=0時結束遞迴,輸出結果)
transform(int n, int b)
transform(n/b,b);(n!=0)
遞迴**:
void transform(int n, int b)
1 ;
3 if(n==0)
4 return;
5 transform(n/b,b);
6 num[i++] = s[n%b];
7 }
演算法執行過程按:將31 轉換為16進製制
第一次呼叫 第二次呼叫 第三次呼叫
transform(31, 16) transform(1, 16) transform(0, 16)
陣列中儲存『f』 陣列中儲存『1』
最後經過迴圈輸出結果。
遞迴棧:
遞迴執行的層次
執行語句的行號
遞迴工作棧狀態說明1
有主函式進入第一層遞迴後,執行至語句(行)5,遞迴呼叫下一層
由第一層的語句(行)5進入第二層遞迴,執行至語句(行)5,進入第三層
第三層遞迴執行至語句(行)4,退出第三層,返回至第二層語句(行)5
執行第二層的語句(行)6,將餘數對應在s陣列的值儲存在num中,退出第二層,返回至第一層語句(行)5
16,7
執行第一層的語句(行)6,將餘數對應在s陣列的值儲存在num中,退出第一層,返回主函式,返回位址00棧空
繼續執行主函式,輸出轉換結果
三:除錯及執行結果
將31轉換為16進製制
將轉換後的結果在遞迴函式中輸出的時候,結果不正確(多了乙個1)
對其進行除錯:(並沒有發現有什麼問題)
(2)解決辦法:將輸出寫在主函式中
執行結果:
四:轉換成非遞迴
分析:
運用函式transform(int n, int b),在n不等於0的情況下迴圈將n%b的餘數在陣列s中對應的字元儲存在num陣列中,num陣列中是以逆序的形式儲存,逆序輸出便得到了轉換結果。
函式transform(int n, int b)的**:
void transform(int n, int b)
;if(n==0)
while(n!=0)
}執行結果:
源程式:
#include#includeint i = 0;
char num[20];
void transform(int n, int b)
; if(n==0)
return;
transform(n/b,b);
num[i++] = s[n%b];
}/*void transform(int n, int b)
; if(n==0)
while(n!=0)
}}*/
void main()
/*for(int j=i;j>=0;j--)
*//*將陣列置空 如果要繼續進行轉換 保證輸出來的數不包含上次轉換的數
這種置空是將已經開闢的記憶體空間裡的數值置為'\0'
不能有效置空數值釋放空間*/
memset(num,'\0',sizeof(num));
printf("\n");
printf("是否繼續轉換(是1, 否0):");
scanf("%d",&flag); }
}
十六進製制字串轉換成十進位製非負整數
輸入乙個以 結束的字串,濾去所有的非十六進製制字元 不分大小寫 組成乙個新的表示十六進製制數字的字串,輸出該字串並將其轉換為十進位制數後輸出。輸入在一行中給出乙個不超過80個字元長度的 以 結束的非空字串。第1行中輸出已濾去所有非十六進製制字元的字串。在第2行中輸出轉換後的十進位制數。題目保證輸出結...
(數論)進製轉換一(將十進位制轉換成b進製)
整理一下進製轉換的題目,題目很簡單,記住轉換的規則即可。記憶體限制 32 兆 題目描述 輸入兩個不超過整型定義的非負10進製整數a和b 231 1 輸出a b的m 1 m 16 進製數。輸入 輸入格式 測試輸入包含若干測試用例。每個測試用例佔一行,給出m和a,b的值。當m為0時輸入結束。輸出 輸出格...
BCD轉換成十進位制
bcd碼是指用二進位制來表示十進位制數的編碼,即用4位二進位制來表示一位十進位制數,因此4位二進位制數表示最大的十進位制數9 1001 只取十六個數中的十個數 有別於8421碼 為了表示兩個十進位制數 十位 個位 需要兩個bcd碼 8位 可以用char 型別來儲存,比如 bcd碼 0x99 153 ...