การแปลงฐานเลขทศนิยม (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
- สร้าง Stack ว่าง
- วนลูป: หารตัวเลขด้วยฐาน, Push เศษเข้า Stack, อัปเดตตัวเลข = ผลหาร
- จนกว่าตัวเลขจะเป็น 0
- Pop จาก Stack มาต่อกันเป็นสตริง (LIFO ให้ลำดับถูกต้อง)
- แปลงเศษ 10-35 เป็น A-Z ตามต้องการ