2059 - 古罗马信息化

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 256 MB

        古罗马,在帝国时期曾是一个跨越亚、非、欧三大洲的大帝国,显赫一时。但到了公元一世纪后,也为奥斯曼帝国所灭。         有一位古罗马的大法师,他预见了古罗马未来的命运,他希望通过他的力量扭转古罗马帝国的命运。这位大法师通过魔法,看到了我们今天的科技,他深信只要把古罗马信息化了,将无敌于当世。但由于他不懂得今天的知识,于是他通过他的法力对时空进行扭曲,把你从今天这个世界请到了古罗马帝国,他希望你能教会他如何使罗马信息化。         当然,要懂得信息化,首先必须让这位大法师明白进制的运算。现在,大法师会给你一系列的罗马数字,请你给他算出罗马数字所对应的八进制数是多少。

题目输入

        输入有多组数据,每行一罗马数字(0<数值<=50),当罗马数字的数值(十进制下)等于100时输入结束。

题目输出

        对应每个罗马数字,输出其8进制的值。

输入/输出样例

输入格式

IV
X

输出格式

4
12

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

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