将一个罗马数转化成对应的阿拉伯数

11 篇文章 0 订阅

阿拉伯数,顾名思义 ,就是我们平时使用最多的数,比如,1,2,3,4,.....

罗马数,是数字最早的表示方式。基本的字符有:I、V、X、L、C、D、M,对应的数字

分别是:1,5,10,50,100,500,1000。

下边给出罗马数的计数规律:

  1.两个相同的字符挨着写,表示相加。比如:XX转化成阿拉伯数就是20.

  2.如果一个字符表示的数比左边的字符表示的数大,则转化成阿拉伯数就是这个数减去

左边的数。

比如:IX表示的阿拉伯数就是10-1 = 9.

          ICMI表示的阿拉伯数是:1000-(IC)+I = 1000-(100-1)+1 = 902.

转化的时候必须先找出给出的罗马数中的最大的字符。

下边给出代码:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#define N 7
char digit[N] = {'I','V','X','L','C','D','M'};
int values[N] = { 1,  5, 10, 50, 100,500,1000 };

int digitToValue(char ch)//字符转化成相应的阿拉伯数
{
	int i = 0;
	for (i = 0;i < N; i++)
	{
		if (digit[i] == ch)
			return values[i];
	}
	return 0;
}
int findMaxIndex(char str[], int L, int R)//找最大字符的下标
{
	assert(L >= 0 &&R >= 0);
	int i = 0;
	int max = digitToValue(str[L]);
	int maxIndex = L;
	for (i = L+1;i <= R;i++)
	{
		int tmp = digitToValue(str[i]);//将字母转为对应的数字
		if (tmp > max)
		{
			max = tmp;
			maxIndex = i;
		}
	}
	return maxIndex;
}
int romenToNumber(char str[],int L,int R)//转化函数
{
	if (L == R)
	{
		return digitToValue(str[L]);
	}
	else if (L > R)
	{
		return 0;
	}
	else
	{
		int maxIndex = findMaxIndex(str, L, R);
		int left = romenToNumber(str, L, maxIndex - 1);
		int right = romenToNumber(str,maxIndex + 1, R);
		int num = digitToValue(str[maxIndex]);
		return num - left + right;
	}
}
int main()
{
	char str[] = "IMCCI";
	int r = romenToNumber(str,0,4);
	printf("%d",r);
	system("pause");
	return 0;
}


   实现部分是采用递归做的。找出这个数字的最大字符,然后用递归的方法求出左边

的数,然后再求出右边的数。将罗马数的几个计数字符定义成全局变量,方便

digitToValue函数查找。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值