วันพุธที่ 27 กุมภาพันธ์ พ.ศ. 2551

เลขโรมัน

ระบบเลขโรมัน
เป็นระบบตัวเลขที่ใช้ในโรมโบราณ เลขโรมันถือเป็น ระบบเลขไม่มีหลัก หมายความว่า ไม่ว่าจะเขียนตัวเลขแต่ละตัวไว้ ณ ตำแหน่งใดของค่าตัวเลขนั้นจะมีค่าคงที่เสมอ ระบบเลขโรมันมีสัญลักษณ์ที่ใช้กันดังนี้

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

ไม่มีความคิดเห็น: