Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การแปลงฐานเลขทศนิยมเป็นหลายฐานด้วย Stack ใน C#

ใช้ **Stack (LIFO)** แปลงฐานเลข (Base Conversion) โดยหารซ้ำแล้วเก็บ Remainder — Pop ออกมาได้เลขในลำดับถูกต้อง

Algorithm: Repeated Division

Algorithm DecimalToBase(n, base):
    Stack stack = new Stack()
    while n > 0:
        remainder = n % base
        stack.Push(remainder)
        n = n / base
    
    result = ""
    while stack not empty:
        result += stack.Pop()
    return result

ตัวอย่าง: Decimal → Binary (Base 2)

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        int number = 45;
        int baseNum = 2; // Binary
        
        var stack = new Stack();
        int n = number;
        
        if (n == 0) {
            Console.WriteLine("0");
            return;
        }
        
        while (n != 0) {
            stack.Push(n % baseNum);
            n /= baseNum;
        }
        
        Console.Write($"Decimal {number} to Base {baseNum}: ");
        while (stack.Count > 0) {
            Console.Write(stack.Pop());
        }
        Console.WriteLine();
        // Output: 101101
        
        Console.ReadKey();
    }
}

Generic Base Converter Method

public static string ConvertToBase(int number, int baseNum) {
    if (baseNum < 2 || baseNum > 36) 
        throw new ArgumentException("Base must be 2-36");
    
    if (number == 0) return "0";
    
    bool isNegative = number < 0;
    if (isNegative) number = -number; // Handle Negative
    
    var stack = new Stack();
    const string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    while (number > 0) {
        int remainder = number % baseNum;
        stack.Push(digits[remainder]);
        number /= baseNum;
    }
    
    char[] result = new char[stack.Count + (isNegative ? 1 : 0)];
    int idx = 0;
    if (isNegative) result[idx++] = '-';
    while (stack.Count > 0) {
        result[idx++] = stack.Pop();
    }
    return new string(result);
}

// Usage
Console.WriteLine(ConvertToBase(45, 2));   // 101101
Console.WriteLine(ConvertToBase(45, 8));   // 55
Console.WriteLine(ConvertToBase(45, 16));  // 2D
Console.WriteLine(ConvertToBase(255, 16)); // FF
Console.WriteLine(ConvertToBase(-45, 2));  // -101101

Built-in Alternatives (Simpler)

int n = 45;
Console.WriteLine(Convert.ToString(n, 2));  // "101101" (Base 2, 8, 10, 16 Only)
Console.WriteLine(Convert.ToString(n, 8));  // "55"
Console.WriteLine(Convert.ToString(n, 16)); // "2D"

// Custom Base: ใช้ Method ข้างต้น

Stack vs Recursion

ApproachProsCons
Stack (Iterative)No Stack Overflow, Explicit ControlManual Stack Management
RecursionConcise, NaturalStack Overflow Risk (Deep), Overhead

สรุป

  • Stack เหมาะสำหรับ Base Conversion เพราะ LIFO = Reverse Order ของ Remainders
  • Generic Method รองรับ Base 2-36 (0-9, A-Z)
  • Built-in Convert.ToString รองรับ Base 2, 8, 10, 16 เท่านั้น
  • จัดการ Negative Numbers และ Zero Case ให้ครบ