编写一个将整数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 "")
- 前言
- 实例一:HelloWorld
- scanf函数学习
- 实数比较
- sizeof()保留字获取类型的大小
- 自增/自减学习
- C学习if条件判断和for循环
- C实现的九九乘法表
- C实现一个比较简单的猜数游戏
- 使用C模拟ATM练习switch..case用法
- 记录一个班级的成绩练习一维数组
- C数组实现矩阵的转置
- C二维数组练习
- 利用数组求前n个质数
- C实现万年历
- C实现数组中元素的排序
- C实现任意进制数的转化
- C判断一个正整数n的d进制数是否是回文数
- C使用递归实现前N个元素的和
- 钢材切割问题
- 使用指针比较整型数据的大小
- 指向数组的指针
- 寻找指定元素
- 寻找相同元素的指针
- 整数转换成罗马数字
- 字符替换
- 从键盘读入实数
- C实现字符行排版
- C实现字符排列
- C实例--判断一个字符串是否是回文数
- 通讯录的输入输出
- 扑克牌的结构定义
- 使用“结构”统计学生成绩
- 报数游戏
- 模拟社会关系
- 统计文件中字符个数
- C实现两个文件的内容输出到同一个屏幕