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

Posted peiyao456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将一个罗马数转化成对应的阿拉伯数相关的知识,希望对你有一定的参考价值。

阿拉伯数,顾名思义 ,就是我们平时使用最多的数,比如,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函数查找。



以上是关于将一个罗马数转化成对应的阿拉伯数的主要内容,如果未能解决你的问题,请参考以下文章

阿拉伯数字转化成罗马字符

罗马数字转阿拉伯数字

leetcode ---13 罗马数字转整数

用java写一个汉字数字转化成阿拉伯数字的算法

求C语言的阿拉伯数字转为其对应英文单词的完整代码 如123 转为one hundred twenty three....

LeetCode 12. Integer to Roman