Chuyển đổi từ số la mã sang số thập phân

Bảng số la mã và một số quy tắc chuyển đổi.
1. Bảng số la mã

I   V   X   L   C   D   M
1   5   10  50  100 500 1000

2. Quy tắc chuyển đổi
a/ 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

b/ “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.

c/
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ừ.

d/ 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

Code:

/***********Convert roman number to decimal number***********
* Author: vncoding
* Date : 18/07/2014
*************************************************************/
#include<stdio.h>
#include<string.h>
#include "stdlib.h"
#include<conio.h>
void main()
{
    int a[20], len, i = 0, j, k;
    char roman[20];
    printf("Nhap day chu so La Ma(Note: chi su dung I,V,X,L,C,D,M): ");
    gets(roman);
    len = strlen(roman);
    for(i = 0; i < len; i++)
    {
        if(roman[i] == 'I')
            a[i] = 1;
        else if(roman[i] == 'V')
            a[i] = 5;
        else if(roman[i] == 'X')
            a[i] = 10;
        else if(roman[i] == 'L')
            a[i] = 50;
        else if(roman[i] == 'C')
            a[i] = 100;
        else if(roman[i] == 'D')
            a[i] = 500;
        else if(roman[i] == 'M')
            a[i] = 1000;
        else
        {
            printf("\nXin nhap lai day so la ma");
            getch();
            exit(1);
         }
    }
    k = a[len-1];
    for(i = len-1; i > 0; i--)
    {
        if(a[i] > a[i-1])
            k = k - a[i-1];
        else if(a[i] == a[i-1] || a[i] < a[i-1])
            k = k + a[i-1];
    }
    printf("\nGia tri thap phan tuong ung la: %d ", k);
    getch();
}

Kết quả:

 

Nhap day chu so La Ma(Note: chi su dung I,V,X,L,C,D,M): VIM
Gia tri thap phan tuong ung la: 1004

Be the first to comment

Leave a Reply

Your email address will not be published.

*