罗马数制__十进制数与罗马数的转换__数字分离

一、罗马数制

罗马数没有权和基数。

Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ     L       C          D            M

1                5                   10            50     100      500        1000

相同的数并列,表示相加:ⅩⅩ = 10 + 10 = 20

右边 < 左边 , 表示相加 : Ⅷ = 5+1+1+1 = 8

左边 < 右边 , 表示右数减左数:Ⅸ = 10 -1 = 9

数字上面加一横,表示原数的1000倍: 非X = 10000

XXIV = 10+ 10 + ( 5-1) = 24


二、阿拉伯数字表示的正整数 转换为 罗马数:

#include<stdio.h> 
void Roman(int num, char *Romans);
int main(){
	int i, j;
	char sRom[51];
	
	printf("Roman numerals from 1 to 100:\n");
	for (i=1; i<=100; i++){
		if((i-1)%5 == 0){
			printf("\n ");
		}
		
		Roman(i, sRom);
		for(j=0; sRom[j] != '\0'; j++){
			printf("%c", sRom[j]);
		}
		
		for(;j<11; j++){
			printf(" ");
		}
	}
}

void Roman(int num,char *Romans){
	int i, j, iTh, iHa, iTe, iZe;
	
	iTh = num / 1000;		//千位 
	num = num % 1000;
	
	iHa = num / 100;		//百位 
	num = num % 100;
	
	iTe = num / 10;			//十位 
	iZe = num % 10;
	
	j = 0;
	//千位数 
	for (i = 0; i < iTh; i++){
		Romans[j++] = 'M';
	} 
	//百位  100~900
	switch(iHa){
		case 3: Romans[j++] = 'C';			//若为3,不退出,执行3次C 
		case 2: Romans[j++] = 'C';
		case 1: Romans[j++] = 'C';	break;
		case 4: Romans[j++] = 'C';
				Romans[j++] = 'D';	break;	// 500-100
		case 5: Romans[j++] = 'D';	break;
		case 6: Romans[j++] = 'D';
				Romans[j++] = 'C';	break;	//500+100
		case 7: Romans[j++] = 'D';
				Romans[j++] = 'C';
				Romans[j++] = 'C';	break;
		case 8: Romans[j++] = 'D';
				Romans[j++] = 'C';
				Romans[j++] = 'C';
				Romans[j++] = 'C';	break;
		case 9: Romans[j++] = 'C';
				Romans[j++] = 'M';	break;
		default: break;
	} 
	
	//十位  /10~90
	switch(iTe){
		case 3: Romans[j++] = 'X';
		case 2: Romans[j++] = 'X';
		case 1: Romans[j++] = 'X';	break;
		case 4: Romans[j++] = 'X';
				Romans[j++] = 'L';	break;
		case 5: Romans[j++] = 'L';	break;
		case 6: Romans[j++] = 'L';
				Romans[j++] = 'X';	break;
		case 7: Romans[j++] = 'L';
				Romans[j++] = 'X';
				Romans[j++] = 'X';	break;
		case 8: Romans[j++] = 'L';
				Romans[j++] = 'X';
				Romans[j++] = 'X';
				Romans[j++] = 'X';	break;
		case 9: Romans[j++] = 'X';
				Romans[j++] = 'C';	break;
		default: break; 
	} 
	//个位 1~9 
	switch(iZe){
		case 3: Romans[j++] = 'I';
		case 2: Romans[j++] = 'I';
		case 1: Romans[j++] = 'I';	break;
		case 4: Romans[j++] = 'I';
				Romans[j++] = 'V'; 	break;
		case 5: Romans[j++] = 'V'; 	break;
		case 6: Romans[j++] = 'V';
				Romans[j++] = 'I';	break;
		case 7: Romans[j++] = 'V';
				Romans[j++] = 'I';
				Romans[j++] = 'I';	break;
		case 8: Romans[j++] = 'V';
				Romans[j++] = 'I';
				Romans[j++] = 'I';
				Romans[j++] = 'I';	break;
		case 9: Romans[j++] = 'I';
				Romans[j++] = 'X';	break;
		default: break;
	} 
	Romans[j++] = '\0'; 	
}

运行结果:



三、任意罗马数字 转换为 十进制整数

(待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值