C语言例程:阿拉伯数字转换为罗马数字

阿拉伯数字转换为罗马数字

实例说明

编写一个将整数 n(1≤n≤9999)转化成罗马数字表示的程序。程序运行的结果如图 25-1 所示,将
1~22 的数字都转换为罗马数字,并显示出来。

实例解析

整数 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 用两个字符 iv 来表示;
 5 用一个字符 v 来表示;
 4 用两个字符 iv 来表示;
 1 用一个字符 i 来表示;有几个 1 就用几个 i 来表示。

为了便于程序处理,将阿拉伯数与对应的罗马数字表示分存在两个数组中。转换时,从尽可
能大的数开始考察,要转换的罗马字符能被当前考察的数相减后仅大于等于 0 的次数,就是该考
察数所对应的罗马数字可连续出现的次数。例如数 23,能连续减 10 两次仅大于等于 0,能连续减
1 三次仅大于等于 0,所以其罗马数字有两个字符 x 和 3 个字符 i,即 xxiii。
另外,程序将要转换的整数作为程序的参数。如只有一个参数,表示 1 至该数范围内的整数
转换成罗马数字,如有两个参数,表示该两数范围内的整数转换成罗马数字。
程序还能检查参数的合理性,并将完成转换的工作和检查的工作分别由两个函数完成。

程序代码

#include <stdio.h>
#define ROWS 4
#define COLS 4
int nums[ROWS][COLS]={{1000,1000,1000,1000},
 {900,500,400,100},
 {90,50,40,10},
 {9,5,4,1}};
char *roms[ROWS][COLS]={{"m","m","m","m"},
 {"cm","d","cd","c"},
 {"xc","l","xl","x"},
 {"ix","v","iv","i"}};

 void checknum(int val)/*检查参数合理性*/
{
    if(val<1||val>9999)
    {
        printf("The number must be in range 1..9999.\n");
        exit(0);
    }
}
void to_roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/
{
    int power,index;
    roman[0]='\0';
    for(power=0;power<ROWS;power++)
        for(index=0;index<COLS;index++)
            while(decimal>=nums[power][index])
            {
                strcat(roman,roms[power][index]);
                decimal-=nums[power][index];
            }

}

int main(int argc,char *argv[ ])
{

    int low,high;
    char roman[25];
    if(argc<2)
    {
        printf("Usage:roman decimal_number\n");/*运行程序需带整数参数*/
        exit(0);
    }
    high=low=atoi(argv[1]);/*将第一个参数转换成整数*/
    checknum(low);
    if(argc>2)
    {/*带两个参数*/
        high=atoi(argv[2]);
        checknum(high);
        if(low>high)
        {
            low=high;
            high=atoi(argv[1]);
        }
    }
    else
        low=1;
    for(;low<=high;low++)
    {
        to_roman(low,roman);
        printf("%d\t%s\n",low,roman);
    }
        return 0;
}

程序运行结果

在这里插入图片描述

归纳注释

程序使用带命令行参数的 main 函数,将 1~n 的所有数都转换为罗马数字并输出。修改某些
语句,也可以实现仅转换一个整数的功能。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文斗士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值