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