Không hiểu đoạn code chuyển đổi cơ số bằng stack

Mọi người có thể giải thích giúp em đoạn code này được không ạ, em đọc trên trang tiếng anh về bài chuyển đổi cơ số bằng stack nhưng em không hiểu đoạn code này cho lắm em chạy thử thì thấy nó chuyển được từ hệ 10 sang hết các hệ luôn ạ

static string Convert(int number, int @base)
{
    var digits = new Stack<string>();
    do
    {
        var d = number % @base;
        if (d >= 10 && d <= 15 && @base == 16)
        {
            var hex = string.Empty;
            switch (d)
            {
                case 10: hex = "A"; break;
                case 11: hex = "B"; break;
                case 12: hex = "C"; break;
                case 13: hex = "D"; break;
                case 14: hex = "E"; break;
                case 15: hex = "F"; break;
            }
            digits.Push(hex);
        }
        else
            digits.Push(d.ToString());
        number /= @base;
    } while (number != 0);
    var sb = new StringBuilder();
    while (digits.Count > 0)
        sb.Append(digits.Pop());
    return sb.ToString();
}

Uhm, code này tương đối đơn giản và straight forward mà cậu? :smile:
Cậu đổi cơ số bằng tay như thế nào, code này gần như làm chính xác như vậy. Vì cậu cần phải chia từ hàng đơn vị, sử dụng stack là trick để lộn ngược lại số của cậu thôi.

5 Likes

Vì khi chia lấy dư thì các số sẽ ra từ cuối đến đầu, nên dùng Stack để lộn chuỗi số lại.

Ví dụ đơn giản: chuyển số 123456 từ cơ số 10 sang… cơ số 10.
Mỗi lần chia lấy dư thì sẽ lấy được tuần tự là: 6 5 4 3 2 1, bạn có thể dùng mảng, List đều được, nhưng tác giả đoạn mã trên muốn dùng Stack thôi. Thậm chí bạn có thể dùng Queue luôn cũng được, bất kì thứ gì lưu được nhiều phần tử, quan trọng là lúc nối lại bạn nối kiểu gì thôi.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?