Roman numerals consist of the letters I, V, X, L, C, D, M which represent the values 1, 5, 10, 50, 100, 500, 1000. These letters are combined in an order-value system. Basically the rule is, if a letter is followed by an equal or lower valued one it counts as positive. If it is followed by a higher valued one it counts negative, i.e., in the number IX, I is followed by X, which is higher valued, hence I serves as a negative influence. This means that the value of I is subtracted from the value of X to yield NINE (9).
There are some refinements to the basic rule:
Notes:
• First line has an integer N which specifies how many numbers follow
• There are N subsequent lines, each of which has either a valid decimal or roman number.
Output Specification:
N lines are output, each containing the corresponding converted number.
There are some refinements to the basic rule:
- There are not more than three equal letters in a number.
- Only I,X,C are used as negative values. For example, it is not MLD for 1450 but MCDL.
- The negating influence is only applied up to the next power of ten. I is only subtracted from V and X but not from L and C and X is only subtracted from L and C. So 9 is IX but 99 is XCIX not IC.
Notes:
- The number 0 will not be present in the input or output.
- The subtraction rule should be applied only to the letter following immediately and should not be propagated i.e. numbers like IXC will not be valid.
• First line has an integer N which specifies how many numbers follow
• There are N subsequent lines, each of which has either a valid decimal or roman number.
Output Specification:
N lines are output, each containing the corresponding converted number.
Sample Input and Output:
Input:
1
999
Output:
CMXCIX
Input:
3
2000
MCDL
MCM
Output:
MM
1450
1900
1
999
Output:
CMXCIX
Input:
3
2000
MCDL
MCM
Output:
MM
1450
1900
Solution:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> //Function for converting decimal number to roman number void to_roman(char input[]); //Function for converting roman number to decimal number void to_decimal(char input[]); void main() { char value[20][20]; int i,j,k,n; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",value[i]); } for(i=0;i<n;i++) { if(value[i][0]<='9' && value[i][0]>='0') to_roman(value[i]); else to_decimal(value[i]); } } void to_roman(char input[]) //Changing decimal value to roman { //printf("\nRoman"); int x,i,j,c,temp,number; char rom[]="IVXLCDM"; x=strlen(input); for(i=0;i<x;i++) { temp=1; number=input[i]-48; if(number==0) continue; for(j=0;j<(x-i-1);j++) {temp = temp * 10;} switch(temp) { case 1: c=0; break; case 5: c=1; break; case 10: c=2; break; case 50: c=3; break; case 100: c=4; break; case 500: c=5; break; case 1000: c=6; break; }//end switch //Printing roman number if( number<4 ) //1~3 { for(j=0;j<number;j++) {printf("%c",rom[c]);} } else if( number==4 )//4 printf("%c%c",rom[c],rom[c+1]); else if( number<9 ) //5~8 { printf("%c",rom[c+1]); for(j=0;j<(number-5);j++) {printf("%c",rom[c]);} } else //9 printf("%c%c",rom[c],rom[c+2]); }//end main for loop, printing new line. printf("\n"); } void to_decimal(char input[]) { //printf("Decimal\n"); int x,i=0,j,temp,number; int c,current; //char rom[]="IVXLCDM"; x=strlen(input); number=0; for(i=0;i<x;i++) { for(j=0;j<2;j++)//Checking current and next character { switch(input[i+j]) { case 'I': c=1; break; case 'V': c=5; break; case 'X': c=10; break; case 'L': c=50; break; case 'C': c=100; break; case 'D': c=500; break; case 'M': c=1000; break; default: c=0; break; } if(j==0) current=c; } //End Checking current and next character if(current<c) //Subtract number=number-current; else //Add number=number+current; }//End main for loop printf("%d\n",number); }
No comments:
Post a Comment