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

C語言實現十進制轉任意進制(2-16):棧與遞歸兩種思路

     編輯:C 語言入門

遞歸版(教學用)


#include 
#include 

void convert(unsigned long n, int base) {
    if (n == 0) return;
    convert(n / base, base);
    int r = n % base;
    putchar(r < 10 ? '0' + r : 'A' + r - 10);
}

int main() {
    unsigned long n; int base;
    printf("輸入十進制數: "); scanf("%lu", &n);
    printf("輸入目標進制(2-16): "); scanf("%d", &base);
    if (n == 0) putchar('0');
    else convert(n, base);
    putchar('\n');
    return 0;
}

遞歸深度 = logbase(n),32 位整數最多 32 層(base=2),棧安全。

棧版(非遞歸,生產推薦)


#include 
#define MAX 64

int main() {
    unsigned long n; int base;
    scanf("%lu %d", &n, &base);
    char stack[MAX]; int top = 0;
    if (n == 0) { putchar('0'); return 0; }
    while (n) {
        int r = n % base;
        stack[top++] = r < 10 ? '0' + r : 'A' + r - 10;
        n /= base;
    }
    while (top--) putchar(stack[top]);
    putchar('\n');
    return 0;
}

棧模擬遞歸:餘數入棧,輸出時出棧,順序自動反轉。

原代碼問題分析

  • 使用 double 存儲整數 → 精度風險,應用 unsigned long。
  • fmod/floor 浮點運算慢且不精確,整數 % / 即可。
  • %lf 讀取 double,改為 %lu 讀無號長整數。
  • 輸出格式缺乏換行控制。

數據結構課延伸:棧 ADT 封裝


typedef struct { char data[MAX]; int top; } Stack;
void push(Stack *s, char c) { if (s->top < MAX) s->data[s->top++] = c; }
char pop(Stack *s) { return s->top ? s->data[--s->top] : 0; }
// 主邏輯同數組版,替換為 push/pop

總結

進制轉換核心:反複取餘、反序輸出。遞歸簡潔,棧顯式可控。整數運算優於浮點。C 標準庫 itoa 非標準,手寫更可移植。

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