Pers.narod.ru. Алгоритмы. Конвертируем римские цифры в арабские |
Алгоритм несложен, если знать значения римских цифр (выводятся программой). Кстати, сейчас идёт год MMIX (2009).
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
int is_correct_input(char *str) {
while(*str) {
if (*str!='I' &&
*str!='V' &&
*str!='X' &&
*str!='L' &&
*str!='C' &&
*str!='D' &&
*str!='M') return 0;
str++;
}
return 1;
}
int convert(char *str) {
int length=0;
while(*str) {
str++;
length++;
}
int active=0;
int next=0;
switch (*str) {
case 'I' : {active=1;break;}
case 'V' : {active=5;break;}
case 'X' : {active=10;break;}
case 'L' : {active=50;break;}
case 'C' : {active=100;break;}
case 'D' : {active=500;break;}
case 'M' : {active=1000;break;}
default : break;
}
int result=active;
while (length>0) {
switch (*(str-1)) {
case 'I' : {next=1;break;}
case 'V' : {next=5;break;}
case 'X' : {next=10;break;}
case 'L' : {next=50;break;}
case 'C' : {next=100;break;}
case 'D' : {next=500;break;}
case 'M' : {next=1000;break;}
default : break;
}
if (next<active) result-=next;
else result+=next;
length--;
str--;
active=next;
}
return result;
}
void main() {
clrscr();
char input_str[20];
printf("This program converts numbers from Rome to Arabian form.\n");
printf("Some Rome digits:\n");
printf("\nI - 1\nV - 5\nX - 10\nL - 50\nC - 100\nD - 500\nM - 1000\n");
printf("\nPut CAPS LOCK status ON and enter a Rome number :\n");
window(1,13,80,18);
do {
clrscr();
scanf("%s",&input_str[0]);
if (is_correct_input(&input_str[0])) {
printf("%s - %d",input_str,convert(&input_str[0]));
}
else {
printf("\nIncorrect input.");
break;
}
printf("\nWant to convert once more(Y/N)?");
} while(getche()!=(int)'N');
printf("\nPress any key to exit...");
getch();
}
|
|