將非負十進位制整數n轉換成b進製

2021-09-24 05:35:13 字數 3153 閱讀 8404

遞迴

一:題目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 ...