pax*_*blo 37
最简单的方法可能是为复杂的情况设置三个数组,并使用一个简单的函数,如:
// convertToRoman:
// In: val: value to convert.
// res: buffer to hold result.
// Out: n/a
// Cav: caller responsible for buffer size.
void convertToRoman (unsigned int val, char *res) {
char *huns[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
char *tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
char *ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
int size[] = { 0, 1, 2, 3, 2, 1, 2, 3, 4, 2};
// Add 'M' until we drop below 1000.
while (val >= 1000) {
*res++ = 'M';
val -= 1000;
}
// Add each of the correct elements, adjusting as we go.
strcpy (res, huns[val/100]); res += size[val/100]; val = val % 100;
strcpy (res, tens[val/10]); res += size[val/10]; val = val % 10;
strcpy (res, ones[val]); res += size[val];
// Finish string off.
*res = '\0';
}
Run Code Online (Sandbox Code Playgroud)
这将处理任何无符号整数,尽管大数字M
在前面会有很多字符,并且调用者必须确保它们的缓冲区足够大.
一旦数量减少到1000以下,它就是一个简单的3表查找,每个查找数百,数十和单位.例如,取其中的情况val
是314
.
val/100
会3
在这种情况下,这样的huns
阵列查找会给CCC
,然后val = val % 100
给你14
的tens
查找.
然后val/10
会1
在这种情况下,这样的tens
阵列查找会给X
,然后val = val % 10
给你4
的ones
查找.
那么val
将4
在那种情况下,所以ones
数组查找将给出IV
.
这给你CCCXIV
的314
.
缓冲区溢出检查版本是一个简单的步骤:
// convertToRoman:
// In: val: value to convert.
// res: buffer to hold result.
// Out: returns 0 if not enough space, else 1.
// Cav: n/a
int convertToRoman (unsigned int val, char *res, size_t sz) {
char *huns[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
char *tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
char *ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
int size[] = { 0, 1, 2, 3, 2, 1, 2, 3, 4, 2};
// Add 'M' until we drop below 1000.
while (val >= 1000) {
if (sz-- < 1) return 0;
*res++ = 'M';
val -= 1000;
}
// Add each of the correct elements, adjusting as we go.
if (sz < size[val/100]) return 0;
sz -= size[val/100];
strcpy (res, huns[val/100]);
res += size[val/100];
val = val % 100;
if (sz < size[val/10]) return 0;
sz -= size[val/10];
strcpy (res, tens[val/10]);
res += size[val/10];
val = val % 10;
if (sz < size[val) return 0;
sz -= size[val];
strcpy (res, ones[val]);
res += size[val];
// Finish string off.
if (sz < 1) return 0;
*res = '\0';
return 1;
}
Run Code Online (Sandbox Code Playgroud)
虽然,在那时,你可以考虑将数百,数十和单位的处理重构成一个单独的函数,因为它们非常相似.我会把它作为额外的练习.