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

Chuyển đổi số sang số la mã c++ 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. Bài viết này sẽ hướng dẫn bạn cách thực hiện quá trình chuyển đổi này bằng ngôn ngữ lập trình C++.

Bài trước:

sắp xếp mảng 2 chiều c++

tìm ký tự trong chuỗi c++

tách chuỗi trong c++

1. Mô tả bài toán

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 giá trị số và ký hiệu tương ứng:

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'};

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. Chương trình mẫu

#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ả chạy chương trình

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:

số nguyên tố cùng nhau

tính tổng các phần tử trong mảng 2 chiều c++

tính tổng các phần tử trong mảng c++

xoá phần tử trong mảng c++

thuật toán prim

thuật toán kruskal 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