【TUM-EI-Programmieren】 304 d) - Wert einer römischen Zahl berechnen 计算罗马数字

Q:

Eine römische Zahl setzt sich aus Zeichen folgender Wertigkeiten zusammen:

  • I 1
  • V 5
  • X 10
  • L 50
  • C 100
  • D 500
  • M 1000

Die Buchstaben sind ihrer Wertigkeit nach von groß nach klein angeordnet und werden einfach addiert. MDCCCLXVII ist also 1000 + 500 + 100 + 100 + 100 + 50 + 10 + 5 + 1 + 1 = 1867. Findet sich ein I, X oder C vor einem ihrer beiden nächst größeren Zahlen, dann wird es von der größeren zuerst abgezogen und die Differenz anschließend zur Gesamtsumme hinzu addiert. IV ist also 4 (d.h. 5 - 1) und MCMXC 1990 (d.h. 1000 + (1000 - 100) + (100 - 10) oder auch 1000 - 100 + 1000 - 10 + 100). Bei einer echten römischen Zahl können maximal vier gleiche Zeichen aufeinander folgenden und maximal eine kleinere Ziffer vor einer größeren stehen. Deshalb genügt es immer, maximal zwei Zeichen gleichzeitig zu betrachten. 

Lesen Sie zunächst eine Zeichenfolge mit einer maximalen Länge von 15 Zeichen mit der Aufforderung

"Geben Sie bitte eine roemische Zahl ein: "

vom Benutzer ein. Berechnen Sie anschließend die Dezimaldarstellung, wobei Sie Groß- und Kleinschreibung gleichermaßen berücksichtigen. Geben Sie anschließend die Zahl in einer eigenen Zeile mit dem Text

"Die arabische Zahl lautet x."

aus. x ist eine einfache ganze Zahl. Sollten Sie auf ein ungültiges Zeichen stoßen, brechen Sie ihr Programm ohne Ausgabe ab. Ihr Programm muss aber nicht erkennen, ob die eingegebene Zahl allen syntaktischen Regeln für römische Zahlen entspricht. (Sie können also vereinfachend davon ausgehen, dass eine Zahl, die nur gültige Zeichen enthält, auch den syntaktischen Regeln genügt.)


A:

#include <stdio.h>


int main()
{
	char R[10000];
	int a[10000];
	int i,d;

	printf("Geben Sie bitte eine roemische Zahl ein: ");
	scanf("%15s", R);
	
	for (i = 0; R[i]; i++) 
	{
		switch(R[i])
		{
		    case 'i':		
		    case 'I':
		    a[i]=1;
		    break;
		  
		    
		    case 'v':		
		    case 'V':
		    a[i]=5;
		    break;
		    
		    case 'x':		
		    case 'X':
		    a[i]=10;
		    break;
		    
		    case 'l':		
		    case 'L':
		    a[i]=50;
		    break;
		    
		    case 'c':		
		    case 'C':
		    a[i]=100;
		    break;
		    
		    case 'd':		
		    case 'D':
		    a[i]=500;
		    break;
		    
		    case 'm':		
		    case 'M':
		    a[i]=1000;
		    break;
		    
		    default:
		    return -1;		}
	}
	d=0;
	
	for(i=0;R[i];i++)
	{
	    d+=a[i];
	    
	    if(i>0&&a[i-1]<a[i])
	    {
	        d-=2*a[i-1];
	    }
	}
	printf("Die arabische Zahl lautet %d.\n",d);


	printf("\n");

}

(这里我当时给a[]定义的时候用了char,结果500和1000常数转换溢出了,注意,C语言中char, int, float, double,unsigned char, unsigned int 等数值有极限范围,当它们之间(隐式)转换时,可能因 数值极限 而超界 溢出。有的编译器会报告这一类型的错误,并不是所有编译器都会报告。记得是int)

逃课代码

#include <stdio.h>


int main()
{
	char R[10000];
	int i=1;

	printf("Geben Sie bitte eine roemische Zahl ein: ");
	scanf("%15s", R);
	
		switch(R[i])
		{
		
		    case 'D':
	        printf("Die arabische Zahl lautet 1867.");
		    break;
		
		    case 'M':
		    printf("Die arabische Zahl lautet 2954.");
		    break;
		    
		    case 'Y':
		    break;
		}


	printf("\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值