เป็นระบบตัวเลขที่ใช้ในโรมโบราณ เลขโรมันถือเป็น ระบบเลขไม่มีหลัก หมายความว่า ไม่ว่าจะเขียนตัวเลขแต่ละตัวไว้ ณ ตำแหน่งใดของค่าตัวเลขนั้นจะมีค่าคงที่เสมอ ระบบเลขโรมันมีสัญลักษณ์ที่ใช้กันดังนี้
I หรือ i มีค่าเท่ากับ 1
V หรือ v มีค่าเท่ากับ 5
X หรือ x มีค่าเท่ากับ 10
L หรือ l มีค่าเท่ากับ 50
C หรือ c มีค่าเท่ากับ 100
D หรือ d มีค่าเท่ากับ 500
M หรือ m มีค่าเท่ากับ 1,000
การเขียนเลขโรมัน
การเขียนเลขโรมัน สามารถเขียนแทนเฉพาะจำนวนเต็มบวกเท่านั้น เนื่องจากในสมัยก่อนโรมยังไม่มีสัญลักษณ์แทนเลขศูนย์หรือเลขทศนิยม โดยให้เขียนจากสัญลักษณ์ที่มีค่ามากแล้วลดหลั่นกันไปยังสัญลักษณ์ที่มีค่าน้อย เช่น
MCCCXXV มีค่าเท่ากับ 1,000 + 300 + 20 + 5 = 1,325
MMMDLXVII มีค่าเท่ากับ 3,000 + 500 + 60 + 7 = 3,567
ถ้าเขียนสัญลักษณ์ที่มีค่าน้อยกว่าไว้ด้านหน้าสัญลักษณ์ที่มีค่ามากกว่า ค่าของจำนวนที่ได้จะมีค่าเท่ากับจำนวนที่มีค่ามากลบด้วยจำนวนที่มีค่าน้อย และจะเขียนสัญลักษณ์เพียงคู่เดียวในแต่ละหลักเท่านั้น เช่น
IX มีค่าเท่ากับ 10 - 1 = 9
XL มีค่าเท่ากับ 50 - 10 = 40
MCMLXXVII มีค่าเท่ากับ 1,000 + (1,000 - 100) + 70 + 7 = 1,977
MMCDLXVIII มีค่าเท่ากับ 2,000 + (500 - 100) + 60 + 8 = 2,468
////////////////////////////////////////////////////
#include "conio.h";
#include "ctype.h";
#include "stdio.h";
#include "stdlib.h";
int main (void)
{
int arabic1 = 0;
int arabic2 = 0;
int stringpos = 0;
int counter = 0;
int roman[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char tempRoman = ' ';
char input[15] = "";
printf ("Roman Numeral Converter for values between 1 and 4999\n\n");
printf ("Enter Roman Numeral(s): ");
/* Read from keyboard until appear an
while ((tempRoman != '\n') && (stringpos < 15))
{
tempRoman = toupper(getchar());
switch (tempRoman)
{
case 'V': case 'L': case 'D':
if ((stringpos > 0) && (input[stringpos - 1] == tempRoman))
{
printf ("\nInput values not correct!\n\n");
exit(100);
}
else
{
input[stringpos++] = tempRoman;
}
break;
case 'M':
/* If appear correctly, be save the char in the string that
that store the characters of roman numeral */
if (counter <= 4)
{
input[stringpos++] = tempRoman;
}
counter++;
if ((counter > 4) && (input[stringpos - 2] == tempRoman))
{
printf ("\nThis program only converts Roman Numerals between 1 and 4999!\n\n");
getch();
}
if ((stringpos > 1) && ((counter > 4) (input[stringpos - 2] != tempRoman)))
{
counter = 1;
}
break;
case 'I': case 'X': case 'C':
if (counter <= 3)
{
input[stringpos++] = tempRoman;
}
counter++;
if ((counter > 3) && (input[stringpos - 2] == tempRoman))
{
printf ("\nInput values not correct!\n\n");
exit(100);
}
if ((stringpos > 1) && ((counter > 3) (input[stringpos - 2] != tempRoman)))
{
counter = 1;
}
break;
case '\n': break;
default: printf ("\nInput values not correct!\n\n");
exit(100);
}
}
for (counter = 0; counter <= stringpos; counter++)
{
switch (input[counter])
{
case 'I': roman[counter] = 1; break;
case 'V': roman[counter] = 5; break;
case 'X': roman[counter] = 10; break;
case 'L': roman[counter] = 50; break;
case 'C': roman[counter] = 100; break;
case 'D': roman[counter] = 500; break;
case 'M': roman[counter] = 1000; break;
}
}
for (counter = 0; counter <= stringpos; counter++)
{
if (roman[counter] >= roman[counter + 1])
{
arabic2 = roman[counter];
}
if ((roman[counter] == (roman[counter + 1] / 10)) (roman[counter] == (roman[counter + 1] / 5)))
{
arabic2 = roman[counter + 1] - roman[counter];
counter++;
}
if (arabic2 < roman[counter + 1])
{
printf ("\nInput values not correct!\n\n");
}
arabic1+= arabic2;
}
printf ("\nArabic Equivalent is: %d\n\n", arabic1);
printf ("\n\n\t\t\t...Press any key to exit.");
getch();
return 0;
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น