从罗马数字到整数,C语言编程的一次有趣的探索——趣味编程

学习工控知识,就来工控小新

农历十一月二十四日 2024/1/ 5


往期推荐

2024年1月4日,每日花费一分钟练习C语言

2024年1月3日,每日花费一分钟练习C语言

每日一练

/ Daily Exercises

题目:

罗马数字转整数

罗马数字包含以下七种字符: I,V,X,L,C

D和M。

字符

数值

1、5、10、50、100、D、u、500、1000

例如,罗马数字2写做 II,即为两个并列的 1。12 写做XII,即为X+II。27写做 XXVII即为XX+V+T通常情况下,罗马数字中小的数字在大的数字的右边。1但也存在特例,例如4不写做 IIII,而是 IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为 IX。这个特殊的规则只适用于以下六种情况:

o

·I可以放在V(5)和X(10)的左边,来表示4和9。

·X可以放在L(50)和C(100)的左边,来表示40和9

O

·C可以放在D(500)和M(1000)的左边,来表示400和900。

给你一个整数,将其转为罗马数字。

示例 1:

输入:num =3

输出:“III”

示例 2:

输入:num =4

输出:“IV”


题目分析

题目要求我们实现两个函数,一个是将罗马数字转换为整数,另一个是将整数转换为罗马数字。我们需要知道罗马数字的规则和对应的数值,以及如何根据特殊情况进行加减运算。我们可以用一个数组或一个哈希表来存储罗马数字和数值的对应关系,然后用一个循环来遍历输入的字符串或数字,根据罗马数字的规则进行转换。


程序展示

根据上面的分析,我们可以用C语言来实现这个算法。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


// 定义一个结构体,用来存储罗马数字和数值的对应关系
typedef struct 
{
    char roman;
    int value;
} RomanNumeral;


// 定义一个数组,用来存储所有可能的罗马数字和数值
RomanNumeral romanNumerals [] = 
{
    {'I', 1},
    {'V', 5},
    {'X', 10},
    {'L', 50},
    {'C', 100},
    {'D', 500},
    {'M', 1000}
};

// 定义一个函数,用来将罗马数字转换为整数
int romanToInt (char* s) 
{
    int num = 0; // 用来存储结果
    int len = strlen (s); // 用来获取输入字符串的长度
    int i, j; // 用来作为循环变量
    // 遍历输入字符串的每个字符
    for (i = 0; i < len; i++)
  {
        // 在数组中查找当前字符对应的数值
        for (j = 0; j < 7; j++) 
    {
            if (s [i] == romanNumerals [j].roman) 
      {
                // 如果当前字符是最后一个字符,或者当前字符对应的数值大于等于下一个字符对应的数值,那么直接加上当前字符对应的数值
              if (i == len - 1 || romanNumerals [j].value >= romanNumerals [j - 1].value) 
        {
        num += romanNumerals [j].value;
        }
       else 
       {
        // 否则,根据特殊的规则,减去当前字符对应的数值
                switch (s [i]) {
                    case 'I':
                        if (s [i + 1] == 'V' || s [i + 1] == 'X') 
            {
                            num -= romanNumerals [j].value;
                        }
                        else
            {
                            num += romanNumerals [j].value;
                        }
                        break;
                    case 'X':
                        if (s [i + 1] == 'L' || s [i + 1] == 'C') 
            {
                            num -= romanNumerals [j].value;
                        }
                        else 
            {
                            num += romanNumerals [j].value;
                        }
                        break;
                    case 'C':
                        if (s [i + 1] == 'D' || s [i + 1] == 'M') 
            {
                            num -= romanNumerals [j].value;
                        }
                        else
            {
                            num += romanNumerals [j].value;
                        }
                        break;
                }
       }
                break;
            }
        }
    }
    // 返回结果
    return num;
}


// 定义一个函数,用来将整数转换为罗马数字
void intToRoman (int num, char* s) 
{
    int i, j=0; // 用来作为循环变量
    // 遍历数组中的每个罗马数字和数值,按照从大到小的顺序
    for (i = 6; i >= 0; i--) 
  {
        // 如果当前数值大于等于数组中的数值,那么将对应的罗马数字添加到输出字符串中,直到当前数值小于数组中的数值
        while (num >= romanNumerals [i].value) 
    {
            // 根据特殊的规则,添加相应的罗马数字
            switch (romanNumerals [i].value)
      {
                case 1:
                    if (num == 4) 
          {
                        s [j++] = 'I';
                        s [j++] = 'V';
                        num -= 4;
                    }
                    else 
          {
                        s [j++] = 'I';
                        num -= 1;
                    }
                    break;
                case 5:
                    if (num == 9) 
          {
                        s [j++] = 'I';
                        s [j++] = 'X';
                        num -= 9;
                    }
                    else 
          {
                        s [j++] = 'V';
                        num -= 5;
                    }
                    break;
                case 10:
                    if (num == 40) 
          {
                        s [j++] = 'X';
                        s [j++] = 'L';
                        num -= 40;
                    }
                    else
          {
                        s [j++] = 'X';
                        num -= 10;
                    }
                    break;
                case 50:
                    if (num == 90) 
          {
                        s [j++] = 'X';
                        s [j++] = 'C';
                        num -= 90;
                    }
                    else
          {
                        s [j++] = 'L';
                        num -= 50;
                    }
                    break;
                case 100:
                    if (num == 400) 
          {
                        s [j++] = 'C';
                        s [j++] = 'D';
                        num -= 400;
                    }
                    else 
          {
                        s [j++] = 'C';
                        num -= 100;
                    }
                    break;
                case 500:
                    if (num == 900)
          {
                        s [j++] = 'C';
                        s [j++] = 'M';
                        num -= 900;
                    }
                    else 
          {
                        s [j++] = 'D';
                        num -= 500;
                    }
                    break;
                case 1000:
                    s [j++] = 'M';
                    num -= 1000;
                    break;
            }
        }
    }
    // 在输出字符串的末尾添加空字符,表示结束
    s [j] = '\0';
}


// 定义一个主函数,用来测试上面的两个函数
int main () 
{
    char s [20]; // 用来存储输入或输出的罗马数字
    int num; // 用来存储输入或输出的整数
    // 从用户输入获取罗马数字或整数
    printf ("请输入罗马数字或整数: ");
    scanf ("%s", s);
    // 如果用户输入的是罗马数字,那么转换为整数并输出
    if (s [0] >= 'A' && s [0] <= 'Z') 
  {
        num = romanToInt (s);
        printf ("转换为整数: %d\n", num);
    }
    // 如果用户输入的是整数,那么转换为罗马数字并输出
    else 
  {
        num = atoi (s);
        intToRoman (num, s);
        printf ("转换为罗马数字: %s\n", s);
    }
    return 0;
}


程序测试

为了验证我们的程序是否正确,我们可以用一些测试用例来检验。

输入一个整数6,可以看到直接转换成罗马数字VI

输入一个罗马数字V,直接转换成数字5


源代码获取

#软件下载通道#



我用夸克网盘分享了「20240105」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。

链接:https://pan.quark.cn/s/9c9387be975e

(链接和提取码建议复制粘贴,手动输入容易出现错误)

#支持一下#

分享整理,测试发布不易 如果您方便的话可以帮忙点一下↓↓

谢谢大家!



下期题目

题目:

寻找峰值

峰值元素是指其值严格大于左右相邻值的元素

给你一个整数数组nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰

值所在位置即可。

你可以假设nums[-1] = nums[n] = -

你必须实现时间复杂度为 0(log n)的算法来解决此问题。


点赞加关注,学习不迷路

微信公众号|工控小新

EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中

#头条挑创作挑战赛#

#学习C语言#

举报
评论 0