文档章节

整数转换成罗马数字

陈洪波
 陈洪波
发布于 2015/05/19 19:34
字数 950
阅读 25
收藏 0

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

下面是我的程序的输出结果:
这里写图片描述

本文转载自:http://blog.csdn.net/hongbochen1223/article/details/45749665

陈洪波
粉丝 2
博文 76
码字总数 1552
作品 0
济南
程序员
私信 提问
LeetCode:Roman to Integer - 罗马数字到阿拉伯数字的转换

1、题目名称 Roman to Integer (罗马数字到阿拉伯数字的转换) 2、题目地址 https://leetcode.com/problems/roman-to-integer/ 3、题目内容 英文:Given a roman numeral, convert it to an...

北风其凉
2015/08/04
1K
0
罗马数字转成整数

原题   Given a roman numeral, convert it to an integer.   Input is guaranteed to be within the range from 1 to 3999. 题目大意   给定一个罗马数字,将其转换成对应的整数。  ...

一贱书生
2016/12/12
4
0
LeetCode:Integer to Roman - 阿拉伯数字到罗马数字的转换

1、题目名称 Integer to Roman (阿拉伯数字到罗马数字的转换) 2、题目地址 https://leetcode.com/problems/integer-to-roman 3、题目内容 英文:Given an integer, convert it to a roman...

北风其凉
2015/08/02
2.5K
0
Leetcode#13. Roman to Integer(罗马数字转整数)

题目描述 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情...

武培轩
2018/09/05
0
0
【算法】LeetCode算法题-Roman To Integer

这是悦乐书的第145次更新,第147篇原创 今天这道题和罗马数字有关,罗马数字也是可以表示整数的,如“I”表示数字1,“IV”表示数字4,下面这道题目就和罗马数字有关,你能猜到吗? 01 看题和...

小川94
2018/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
22分钟前
3
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
24分钟前
4
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
41分钟前
3
0
zk中FinalRequestProcessor解析

是处理器最后一个环节 FinalRequestProcessor implements RequestProcessor 处理器链最后一个环节处理事务和非事务请求最后一个环节 构造器 public FinalRequestProcessor(ZooKeeperServer z...

writeademo
41分钟前
3
0
Axios 详解

首先祝广大程序猿们节日快乐! 一、axios简介 基于promise,用于浏览器和node.js的http客户端 二、特点 支持浏览器和 node.js 支持 promise 能拦截请求和响应 能转换请求和响应数据 能取消请求...

张兴华ZHero
42分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部