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