ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
编写一个将整数n(1 <= n <= 9999)转换成罗马数字。 - 整数n(1<=n<=9999)与罗马数字表示有以下对应关系 - 1000 - m,有几个1000就有几个m对应 - 900 - 两个字符cm - 500 - 一个字符d - 400 - 两个字符cd - 100 - 一个字符c,有几个100就用几个c表示 - 90 - 两个字符xc - 50 - 一个字符l - 40 - 两个字符xl - 10 - 一个字符x,有一个10就用几个x - 9 - 用两个字符ix表示 - 5 - 用一个字符v来表示 - 4 - 用两个字符iv表示 - 1 - 用一个字符i表示,有几个1就用几个i 假如说我们有一个数字22,那么它转换的方式为22-10=12>=0; 则肯定先有一个x,接着12-10=2>=0;则接着在x后面加上x 变为xx;2-1=1>=0;则肯定后面还需要添加一个i变为xxi,1-1=0>=0;后面还要添加一个i变为xxii。 这样我们可以这样做,将对应的罗马数字和对应的数字放到两个二维数组中一一对应。 ~~~ char *roman[ROW][COLUMN] = { {"m","m","m","m"}, {"cm","d","cd","c"}, {"xc","l","xl","x"}, {"ix","v","iv","i"} }; int num[ROW][COLUMN] = { {1000,1000,1000,1000}, {900,500,400,100}, {90,50,40,10}, {9,5,4,1} }; ~~~ 这样每一个数字进入之后,从数字数组的第一个元素开始,进行减法,如果差大于等于0,接着对这个数字进行减法操作,如果小于0了,则进入下一个数字进行同样的减法操作,每次差大于等于0的时候,在后面添加上对应的罗马数字。则转换算法应该是这样的。 ~~~ /** * @brief toRoman 将数字转换成罗马数字保存到数组rom中 * @param number 要被转换的数字 * @param rom 将转换后的罗马数字保存到rom数组中 */ void toRoman(int number,char rom[]){ int temp = number; int i,j; rom[0]='\0'; for(i = 0;i < ROW;i++){ for(j = 0;j < COLUMN;j++){ while((temp-num[i][j]) >= 0){ strcat(rom,roman[i][j]); temp = temp-num[i][j]; } } } } ~~~ 好了,主体函数已经有了,现在附上我的整体的代码: ~~~ #include <stdio.h> #include <string.h> #define ROW 4 #define COLUMN 4 void toRoman(int number,char rom[]); /** * @brief main 编写一个将整数(1 <= x <= 9999)转化成对应的罗马数字的程序 * @return */ /** * 整数n(1<=n<=9999)与罗马数字表示有以下对应关系 * 1000 - m,有几个1000就有几个m对应 * 900 - 两个字符cm * 500 - 一个字符d * 400 - 两个字符cd * 100 - 一个字符c,有几个100就用几个c表示 * 90 - 两个字符xc * 50 - 一个字符l * 40 - 两个字符xl * 10 - 一个字符x,有一个10就用几个x * 9 - 用两个字符ix表示 * 5 - 用一个字符v来表示 * 4 - 用两个字符iv表示 * 1 - 用一个字符i表示,有几个1就用几个i * */ /** * 用两个二维数组保存整数和罗马数字的 * 对应关系 */ char *roman[ROW][COLUMN] = { {"m","m","m","m"}, {"cm","d","cd","c"}, {"xc","l","xl","x"}, {"ix","v","iv","i"} }; int num[ROW][COLUMN] = { {1000,1000,1000,1000}, {900,500,400,100}, {90,50,40,10}, {9,5,4,1} }; int main(int argc,char *argv[]) { int low,high; if(argc < 2){ printf("Please enter the range of the numbers.\n"); }else if(argc == 2){ low = 1; high = atoi(argv[1]); }else if(argc == 3){ low = atoi(argv[1]); high = atoi(argv[2]); }else{ printf("There is more params!!\n"); } int i = low; for(i = low;i <= high;i++){ char rom[25]; toRoman(i,rom); printf("%d => %s\n",i,rom); } return 0; } /** * @brief toRoman 将数字转换成罗马数字保存到数组rom中 * @param number 要被转换的数字 * @param rom 将转换后的罗马数字保存到rom数组中 */ void toRoman(int number,char rom[]){ int temp = number; int i,j; rom[0]='\0'; for(i = 0;i < ROW;i++){ for(j = 0;j < COLUMN;j++){ while((temp-num[i][j]) >= 0){ strcat(rom,roman[i][j]); temp = temp-num[i][j]; } } } } ~~~ 下面是我的程序的输出结果: ![这里写图片描述](https://box.kancloud.cn/2016-05-24_5743c075916d7.jpg "")