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:
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ằ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:
tính tổng các phần tử trong mảng 2 chiều c++