[C++] Chuyển đổi số thập phân sang số La Mã

Chuyển đổi số sang số la mã là quá trình biến đổi một số được biểu diễn theo hệ thập phân sang một số được biểu diễn bằng các ký tự La Mã tương ứng. Sau đây, chúng ta hãy cùng nhau tìm hiểu cách thực hiện chuyển đổi này bằng ngôn ngữ lập trình C++ trong bài viết dưới đây.

Bài trước >> Bài 18: sắp xếp các số nguyên tố về đầu dãy, các số không phải là số nguyên tố về cuối dãy

1. Bài toán chuyển đổi số sang số la mã

Bài 19 (TH-CSLT-04): Số La Mã là một tập các ký hiệu: {‘I’,’V’,’X’,’L’,’C’,’D’,’M’} tương đương với các giá trị số ở chữ số Latin gồm: {1,5,10,50,100,500,1000}. Hãy viết chương trình nhập vào một số nguyên dương N (N<10000). Hiện ra màn hình dạng chữ số La Mã của số nguyên nhập.

2. Phân tích bài toán

2.1 Quy luật của số La Mã

  • Số thập phân được cấu thành từ các chữ số đơn lẻ. Ví dụ: 1989 được ghép bởi 1,9,0,8. Còn đối với cách biểu diễn chữ số la mã thì mỗi chữ số khác 0 ở mỗi hàng ( hàng đơn vị, hàng chục, hàng trăm,…) sẽ được biểu diễn bởi 1 kí tự số la mã. 1000 = M, 900 = CM, 0 không được biểu diễn, 8 = VIII. 1908 = MCMVIII
  • “I”, “X”, “C”, “M” có thể được xuất hiện liên tiếp (cạnh nhau) tối đa 3 lần. Tuy nhiên, các kí tự này có thể xuất hiện nhiều hơn. (Ví dụ: XXXIX). Các kí tự “D”, “L”, “V” không được phép lặp lại.
  • Chữ số đi sau chữ số khác lớn hơn hoặc bằng thì cộng thêm vào:

VI = V + I = 5 + 1 = 6
LX = L + X = 50 + 10 = 60
XX = X + X = 10 + 10 = 20

  • Chữ số đi trước chữ số khác lớn hơn thì trừ bớt đi:

IV = V – I = 5 – 1
XL = L – X = 50 – 10 = 40

“I” chỉ có thể bị trừ bởi “V”, “X”. ( IV = V – I = 5 – 1 = 4, IX = X – I = 10 – 1 = 9)
“X” chỉ có thể bị trừ bởi “C”, “L”. ( XC = 100 – 10 = 90, XL = 50 – 10 = 40)
“C” chỉ có thể bị trừ bởi “D” và “M”. (CD = 500 – 100 = 400, CM = 1000)
“V”, “L”, “D” không bao giờ bị trừ.

  • Nếu thêm 1 dấu gạch ngang trên đầu thì giá trị của nó bằng giá trị hiện tại nhân với 1000

2.2 Ý tưởng thuật toán chuyển số sang số la mã c++

– Tạo mảng

v = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
tương ứng với
s = [‘M’, ‘a’, ‘D’, ‘b’, ‘C’, ‘e’, ‘L’, ‘f’, ‘X’, ‘g’, ‘V’, ‘h’, ‘I’]

rồi duyệt 1 vòng lặp nếu giá trị nguyên n hiện tại >= v[i] thì in ra s[i] và trừ v[i] cho n tới khi n < v[i].

Ở đây mình sẽ ký hiệu ký tự ‘a’, ‘b’, ‘e’, ‘f’, ‘g’,  ‘h’ tương ứng với ‘CM’, ‘CD’, ‘XC’, ‘XL’, ‘IX’, ‘IV’. Tại vì mình có thử khai báo ‘CM’ vào mảng mà nó bị lỗi nên mình thay các ký tự a, b,.. đại diện cho nó. Nếu kết quả trả về là ‘a’ thì mình sẽ xuất ra màn hình là ‘CM’. Chả hiểu lỗi gì, ai biết chỉ mình với nhé hehe.

ví dụ 1908:
1908 > 1000, in ra M, trừ 1000 còn 908
908 > 900, in ra CM,  trừ 900 còn 8
8 < 500, không in không trừ
8 < 400, không in không trừ
8 < 100, không in không trừ
8 < 90, không in không trừ
8 < 50, không in không trừ
8 < 40, không in không trừ
8 < 10,không in không trừ
8<9, không in không trừ
8>5, in ra V, trừ 5 còn 3
3<4, không in không trừ
3>1, in ra I trừ 1 còn 2
2>1, in ra 1 trừ 1 còn 1
1 >= 1, in ra I, trừ 1 còn 0, kết thúc
vậy 1908 = MCMVIII

3. Code mẫu chương trình

#include<iostream>

using namespace std;

int main(){

    int n, i,j;

    int v[]={1000, 900, 500, 400, 100, 90,  50,  40,  10,  9,    5,   4, 1};
    char s[]={'M', 'a', 'D', 'b', 'C', 'e', 'L', 'f', 'X', 'g', 'V', 'h', 'I'};

    cout<<"Nhap so nguyen duong n < 10000: "; cin>>n;

    i=0;
    while(n!=0){

        while(n>=v[i])
        {
            if(s[i]=='a'){
                cout<<"CM";
            }else if(s[i]=='b'){
                cout<<"CD";
            }else if(s[i]=='e'){
                cout<<"XC";
            }else if(s[i]=='f'){
                cout<<"XL";
            }else if(s[i]=='g'){
                cout<<"IX";
            }else if(s[i]=='h'){
                cout<<"IV";
            }else{
                cout<<s[i];
            }
            n=n-v[i];
        }
        i++;
    }
}

4. Kết quả

Bài 19 chuyển số thập phân thành số la mã

Bằng việc sử dụng ngôn ngữ lập trình C++, chuyển đổi số thập phân sang số La Mã có thể được thực hiện một cách nhanh chóng và dễ dàng. ttnguyen.net chúc các bạn thành công!

Tải full bài tập thực hành C/C++ có lời giải:

Bài tiếp theo: Bài 20. cách xoá phần tử trong mảng c++

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em