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

แปลงฐานเลขทศนิยมเป็นฐานอื่นๆ อย่างรวดเร็วใน C#

การแปลงฐานเลขทศนิยม (Decimal) เป็นฐานอื่นๆ ด้วย Stack

อัลกอริทึมมาตรฐาน: หารตัวเลขด้วยฐานเป้าหมายซ้ำๆ เก็บเศษ (remainder) ไว้ใน Stack แล้ว Pop ออกมา จะได้เลขในฐานใหม่เรียงถูกต้อง

ตัวอย่างโค้ด: แปลงเป็นฐาน 2, 8, 16

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        Console.Write("ป้อนตัวเลขฐาน 10: ");
        int n = int.Parse(Console.ReadLine());
        
        Console.Write("ป้อนฐานเป้าหมาย (2, 8, 16): ");
        int baseNum = int.Parse(Console.ReadLine());

        string result = ConvertToBase(n, baseNum);
        Console.WriteLine($"ผลลัพธ์ฐาน {baseNum}: {result}");
    }

    static string ConvertToBase(int number, int baseNum)
    {
        if (number == 0) return "0";
        
        Stack stack = new Stack();
        bool isNegative = number < 0;
        number = Math.Abs(number);

        while (number > 0)
        {
            int remainder = number % baseNum;
            stack.Push(remainder);
            number /= baseNum;
        }

        // สร้างสตริงผลลัพธ์
        string result = "";
        while (stack.Count > 0)
        {
            int digit = stack.Pop();
            // แปลงค่า 10-15 เป็น A-F
            result += digit < 10 ? digit.ToString() : ((char)('A' + digit - 10)).ToString();
        }

        return isNegative ? "-" + result : result;
    }
}

ตัวอย่างการทำงาน

ป้อนตัวเลขฐาน 10: 45
ป้อนฐานเป้าหมาย (2, 8, 16): 2
ผลลัพธ์ฐาน 2: 101101

ป้อนตัวเลขฐาน 10: 45
ป้อนฐานเป้าหมาย (2, 8, 16): 8
ผลลัพธ์ฐาน 8: 55

ป้อนตัวเลขฐาน 10: 45
ป้อนฐานเป้าหมาย (2, 8, 16): 16
ผลลัพธ์ฐาน 16: 2D

วิธีที่ง่ายกว่า: ใช้ Convert.ToString


int n = 45;
Console.WriteLine(Convert.ToString(n, 2));  // 101101 (ฐาน 2)
Console.WriteLine(Convert.ToString(n, 8));  // 55 (ฐาน 8)
Console.WriteLine(Convert.ToString(n, 16)); // 2D (ฐาน 16)

หมายเหตุ: Convert.ToString รองรับฐาน 2, 8, 10, 16 เท่านั้น

การแปลงฐานทั่วไป (Custom Base)


static string ToCustomBase(long number, int baseNum, string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
    if (baseNum < 2 || baseNum > digits.Length) throw new ArgumentException("Invalid base");
    if (number == 0) return "0";
    
    bool neg = number < 0;
    number = Math.Abs(number);
    
    var stack = new Stack();
    while (number > 0)
    {
        stack.Push(digits[(int)(number % baseNum)]);
        number /= baseNum;
    }
    
    return (neg ? "-" : "") + new string(stack.ToArray());
}

// ใช้งาน
Console.WriteLine(ToCustomBase(100, 36)); // 2S (ฐาน 36)

สรุปขั้นตอนอัลกอริทึม Stack

  1. สร้าง Stack ว่าง
  2. วนลูป: หารตัวเลขด้วยฐาน, Push เศษเข้า Stack, อัปเดตตัวเลข = ผลหาร
  3. จนกว่าตัวเลขจะเป็น 0
  4. Pop จาก Stack มาต่อกันเป็นสตริง (LIFO ให้ลำดับถูกต้อง)
  5. แปลงเศษ 10-35 เป็น A-Z ตามต้องการ