Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Chuyển đổi số sang số La Mã (Number to Roman Numerals)


Giới thiệu

Số La Mã là các số phi vị trí. Một số chữ số được đặt cùng nhau để tạo thành một số trong hệ La Mã. Ví dụ số 75 có thể biểu diễn như 75 = 50 + 10 + 10 + 5, nên chữ số La Mã là LXXV.

Trong bài toán này, một số được cung cấp ở dạng thập phân, nhiệm vụ của ta là chuyển đổi nó thành chuỗi chữ số La Mã.

Có các ký hiệu khác nhau và giá trị của chúng, như sau:

IIVVIXXXLLXCCCDDCMMMMMMV'
145910405090100400500900100040005000


Sử dụng bảng này, ta có thể dễ dàng tìm chữ số La Mã của một số cho trước.

Đầu vào và Đầu ra

Đầu vào: Số thập phân: 3569
Đầu ra: Số La Mã tương đương của 3569 là: MMMDLXIX

Thuật toán

decToRoman(nuList, num)
Đầu vào: Danh sách chữ số với giá trị, số cần chuyển sang La Mã.
Đầu ra: Chữ số La Mã cho số cho trước.

Begin
    if num ≠ 0, then
        max := lấy giá trị chữ số lớn nhất, không lớn hơn số
        hiển thị nuList[max].symbol
        num := num – nuList[max].value
        decToRoman(nuList, num)
End

Ví dụ (C++)

#include <iostream>
using namespace std;

struct numeral {
    string sym;
    int val;
};

int maxNume(numeral nu[], int num) {
    int index;
    for(int i = 0; i < 15; i++)  // 15 chữ số trong mảng
        if(nu[i].val <= num)
            index = i;  // chỉ số chữ số lớn nhất, không lớn hơn số
    return index;
}

void decToRoman(numeral nu[], int num) {
    int max;
    if(num != 0) {
        max = maxNume(nu, num);
        cout << nu[max].sym;
        num -= nu[max].val;  // giảm số
        decToRoman(nu, num);  // đệ quy in chữ số
    }
}

int main() {
    int number;
    numeral nume[15] = {{"I",1},{"IV",4},{"V",5},{"IX",9},
        {"X",10},{"XL",40},{"L",50},{"XC",90},
        {"C",100},{"CD",400},{"D",500},{"CM",900},
        {"M",1000},{"MMMM",4000},{"V'",5000}
    };
    cout << "Enter a decimal number: "; cin >> number;
    if(number > 0 && number <= 5000) {  // kiểm tra số nhập
        cout << "The Roman equivalent of " << number << " is: ";
        decToRoman(nume, number);
    } else {
        cout << "Invalid Input";
    }
}

Kết quả

Enter a decimal number: 3569
The Roman equivalent of 3569 is: MMMDLXIX