整数转换成罗马数字

编写一个将整数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];
            }
        }
    }
}

下面是我的程序的输出结果:

时间: 2024-10-11 13:23:22

整数转换成罗马数字的相关文章

第13题:整数转换成罗马数字&amp;第14题:罗马数字转换成整数

写在前面: 这两道题合起来写吧,其实整数转罗马数字我前天就写完了,当我想写罗马数转整数的时候竟然脑子一片空白,想了几分钟就想起来Map,本着学习的目的最终还是不想用Map,坚持C语言,今天脑子里直接涌出了Switch方式转换,看来"蹲在马桶上编程"的方式还是蛮不错的o(^▽^)o 整数转罗马数字:主要建立对应关系,输出时有点像百钱百鸡 罗马数字转整数:输入罗马数字(其实就是字符数组)后,for循环遍历,找出对应,这个再看不懂的建议去看看罗马数字表示方法. 第13题:整数转换成罗马数字

计蒜客 挑战难题 整数转换成罗马数字

给定一个整数num,( 1<=num<=3999),将整数转换成罗马数字. 如1,2,3,4,5对应的罗马数字分别位I,II,III,IV,V等. 格式: 第一行输入一个整数,接下来输出对应的罗马数字. 提示: 罗马数字的常识见此链接,对做题有帮助哦-尤其是表示方法. http://baike.baidu.com/link?url=injU8M4bAoc2zRZQ1GtgrfvuzCJO9PLnq6fpQGJLenakbzo-rS8p-qsYHR_81-aN 样例输入 123 样例输出 CXX

[LeetCode] Integer to Roman 整数转化成罗马数字

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 之前那篇文章写的是罗马数字转化成整数(http://www.cnblogs.com/grandyang/p/4120857.html), 这次变成了整数转化成罗马数字,基本算法还是一样.由于题目中限定了输入数字的范围(1 - 3999), 使得题目变得简单了不少. 基本字符 I V

整数转换成字符

2. 进制间的转换 void to2str(int num, int i, char str2[32]) { if (num == 0) { return; } else { to2str(num / 2, i + 1, str2);//位数向前 str2[i] = (num % 2) + '0';//字符整数的转换,取模运算后得到的每一个数字变成字符 } } void to8str(int num, int i, char str8[32]) { if (num == 0) { return;

将10进制整数转换成16进制整数输出

题意: 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示. Input 每行一个整数x,0<= x <= 2^31. Output 每行输出对应的八位十六进制整数,包括前导0. 案例输出: Sample Input 0 1023 Sample Output 0x00000000 0x000003FF 注意: 用cin>>输入时无需担心Output Limint Exceeded,而用scanf输入应该加上!=EOF. 代码如下: 1 #include<

[LintCode] Integer to Roman 整数转化成罗马数字

Given an integer, convert it to a roman numeral. The number is guaranteed to be within the range from 1 to 3999. Have you met this question in a real interview? Clarification What is Roman Numeral? https://en.wikipedia.org/wiki/Roman_numerals https:/

【读书笔记】C Primer Plus ch.15位运算 示例程序15.1 整数转换成二进制字符串

正文: https://www.zybuluo.com/RayChen/note/595213

Javascript--将十进制数字转换成罗马数字显示

下午在FCC(FreeCodeCamp)中文网上做到一道练习题:将给定的数字转换成罗马数字.折磨了一个多小时,终于能把基本功能给实现了.过程如下: 关于罗马数字 罗马数字的详细介绍可见百度,或者罗马数字.这里作一下简单的介绍(图片选自罗马数字): 1.罗马数字选用7个罗马字母(大写)作数字,代表的十进制数字如下: 一些数字用罗马数字表示为: 2.罗马数字的计数规则: (1) 相同数字连写,则值相加,如III = 3: (2) 小的数在大的数右边,也是累加,如VI = 6: (3) 小的数在大的数

谭浩强 c程序设计 8.17用递归法将一个整数n转换成字符串。例如,输入486,应输出字符串&quot;486&quot;。n的位数不确定,可以是任意位数的整数。

8.17用递归法将一个整数n转换成字符串.例如,输入486,应输出字符串"486".n的位数不确定,可以是任意位数的整数. #include <stdio.h> char str1[20];int i=0;long n;int main(){        int longToStr(long n);    char *revstr(char *str, int len);    printf("请输入一个整数n:\n");    scanf("