Loading

计蒜课_罗马数字转换为整数

思路总结:这道题重点在于对罗马数字规则的把握,熟悉了罗马数字的规则以后,实现主要思路是

1、输入的罗马数字字符串str;

2、一个字符数组C,在代码中给出c;

在给定的字符数组C中,不断地判断C的当前元素是否为str的前缀,即分别确定str所代表数字的千位,百位,十位,个位:

实现代码如下:

 1 int getLength(const char*str) {//获取字符串的长度;
 2     int length_of_str;
 3     for (length_of_str = 0;str[length_of_str] != '\0';length_of_str++);
 4     return length_of_str;
 5 }
 6 bool is_prefix(const char*str1,const char*str2) {//判断str1是否为str2的前缀;
 7     int length_of_str1 = getLength(str1);
 8     int length_of_str2 = getLength(str2);
 9     if (length_of_str1 > length_of_str2)
10         return false;
11     for (int i = 0;i < length_of_str1;i++) {
12         if (str1[i] != str2[i]) {
13             return false;
14         }
15     }
16     return true;
17 }
18 int RomanToInt(const char*str) {//主要实现函数;
19     char*c[4][10] = {
20         {"","I","II","III","IV","V","VI","VII","VIII","IX"},//1~9;
21         {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},//10~90;
22         {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},//100~900;
23         {"","M","MM","MMM"},//1000~3000;
24     };
25     int result = 0;//存放结果;
26     int length_of_str = getLength(str);//获取待转换为罗马数字的字符串的长度;
27     int currentrow=3;//初始位置的列数;
28     int currentcolumn=3;//初始位置的行数;
29     int current_length;
30     while((currentrow>=0)&&(str[0] != '\0')){
31         current_length = getLength(c[currentrow][currentcolumn]);
32         if (is_prefix(c[currentrow][currentcolumn],str)) {
33             result = result*10+currentcolumn;//更新result;
34             currentrow--;
35             currentcolumn = 9;
36             str += current_length;//若对字符串的前缀判断成功,则将字符串str的指针右移相应长度;
37         }
38         else {
39             if (--currentcolumn == 0) {
40                 currentrow--;
41                 currentcolumn = 9;
42             }
43         }
44 
45     }
46     return result;
47 }

 

posted @ 2017-05-02 19:21  lif323  阅读(204)  评论(0编辑  收藏  举报