2059 - 古罗马信息化
古罗马,在帝国时期曾是一个跨越亚、非、欧三大洲的大帝国,显赫一时。但到了公元一世纪后,也为奥斯曼帝国所灭。 有一位古罗马的大法师,他预见了古罗马未来的命运,他希望通过他的力量扭转古罗马帝国的命运。这位大法师通过魔法,看到了我们今天的科技,他深信只要把古罗马信息化了,将无敌于当世。但由于他不懂得今天的知识,于是他通过他的法力对时空进行扭曲,把你从今天这个世界请到了古罗马帝国,他希望你能教会他如何使罗马信息化。 当然,要懂得信息化,首先必须让这位大法师明白进制的运算。现在,大法师会给你一系列的罗马数字,请你给他算出罗马数字所对应的八进制数是多少。
Input
输入有多组数据,每行一罗马数字(0<数值<=50),当罗马数字的数值(十进制下)等于100时输入结束。
Output
对应每个罗马数字,输出其8进制的值。
Examples
Input
IV X
Output
4 12
Hint
用来表示罗马数字的字母都是大写字母
Solution C
#include<stdio.h> void F(int n) { if (n < 8) printf("%d", n); else { F(n / 8); printf("%d", n % 8); } } int main() { char roma[10]; int num, i, first, next; while (scanf("%s",roma) != EOF) { num = 0; i = 0; while (roma[num] != 0) { if (roma[num] == 'I') { first = 1; } if (roma[num] == 'V') { first = 5; } if (roma[num] == 'X') { first = 10; } if (roma[num] == 'L') { first = 50; } if (roma[num] == 'C') { first = 100; } if (roma[num] == 'D') { first = 500; } if(roma[num]=='M') first = 1000; if(roma[num+1]=='I') next = 1; if(roma[num+1] == 'V') next=5; if(roma[num+1]=='X') next=10; if(roma[num+1]=='L') next=50; if(roma[num+1]=='C') next=100; if(roma[num+1]=='D') next=500; if(roma[num+1]=='M') next=1000; if(first<next) { i=i+next-first; num++; } if(first>=next) { i=i+first; } first=0; next=0; num++; } if(i == 100) break; F(i); printf("\n"); } return 0; }
Solution C++
#include <stdio.h> int get_convert (char a[],int num[]); void num_convert (char a[],int num[]); enum { NUM=15 }; enum { END=100 }; int main() { char a[NUM]; int input_num=0,num[NUM]; while (input_num!=END) { if (scanf("%s",a)==EOF) break; input_num=get_convert(a,num); if (input_num==END) break; else printf("%o\n",input_num); } return 0; } int get_convert (char a[],int num[]) { num_convert(a,num); int i=0,s=0; for (i=0;num[i]!=-1;i++) { if (i==0) s=num[i]; else if (num[i]<num[i-1]) s-=num[i]; else s+=num[i]; } return s; } void num_convert (char a[],int num[]) { int i=0,j=0; int temp[NUM]; for (i=0;a[i]!='\0';i++) { switch (a[i]) { case 'I':temp[i]=1;break; case 'V':temp[i]=5;break; case 'X':temp[i]=10;break; case 'L':temp[i]=50;break; case 'C':temp[i]=100;break; } } num[i]=-1; j=i-1; for (i=0;j>=0;j--,i++) { num[i]=temp[j]; } }
Hint
用来表示罗马数字的字母都是大写字母