首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言遞歸實現:二進位字串轉十進位整數

     編輯:關於C語言

遞歸思路

從最高位開始讀取字元,每讀一位,當前值 = 前序值 × 2 + 當前位。遞歸參數傳遞「已處理位數」與「累積值」。

修正後完整代碼

#include <stdio.h>

int binToDecRec(const char *s, int idx, int acc) {
    if (s[idx] == '\0' || s[idx] == '#') return acc;  // 結束符
    int bit = s[idx] - '0';                           // '0'->0, '1'->1
    return binToDecRec(s, idx + 1, acc * 2 + bit);
}

int main() {
    char str[65];
    printf("請輸入二進位字串 (以 # 結束): ");
    scanf("%64s", str);  // 讀取至空白或 #,若含 # 需用 fgets
    // 簡化:假設輸入純 0/1 字串
    int result = binToDecRec(str, 0, 0);
    printf("十進位值: %d\n", result);
    return 0;
}

原始碼問題分析

  • scanf("%c", c):c 未取址,且只讀單一字元。
  • change(n+1, sum, m):參數傳遞混亂,sum/m 應為指標或回傳值。
  • pow(2, *m-n):浮點運算不必要,整數左移或乘 2 即可。
  • 遞歸終止條件不明確,易導致無限遞歸。

迭代版(更高效)

int binToDecIter(const char *s) {
    int val = 0;
    while (*s == '0' || *s == '1') {
        val = val * 2 + (*s - '0');
        s++;
    }
    return val;
}

關鍵點總結

  1. 遞歸版本清晰展示「狀態傳遞」概念,適合教學。
  2. 實際工程首選迭代版,避免堆疊溢位且效能更高。
  3. 輸入驗證:檢查字元是否為 '0'/'1',忽略前導空白,處理溢位(val > INT_MAX/2)。
  4. 若需支援負數(二補數),須知位寬並處理符號位。

二進位轉十進位是理解位元運算與數制轉換的基礎練習,遞歸與迭代兩種寫法各有教學與工程價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved