迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++中的罗马数字转换器

作者:迹忆客 最近更新:2023/04/09 浏览次数:

在当今世界,我们正在使用多种数字系统来帮助以不同方式表示数字。 其中之一是罗马数字系统。

古罗马人发明了它们来计算和进行日常活动。 本文将讨论罗马数字系统和将十进制数字转换为罗马数字的程序。


C++中的罗马数字转换器

罗马数字以特定格式表示数字,用于计数和其他目的。

您一定在学校听说过这些罗马数字,并在钟表中看到过它的实际例子。 罗马数字通常代表时钟中的数字。

罗马数字系统由七个拉丁字母的组合表示。 七个字母或符号中的每一个都有一个确定的值。

下面详细说明这七个字母及其具体值。

I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000

但是,要记住一件事,因为在 1000 之后,我们没有任何 10000 的符号; 因此,罗马数字所能表示的最高数字是3999。

现在,让我们谈谈如何将十进制数转换为罗马数字。

罗马数字中的数字是按从左到右的降序排列的; 但是,在某些情况下,为了避免重复相同的四个连续字符,例如(IIII 或 XXXX),会遵循减法符号。 减法符号用于其中包含 4 和 9 的数字。

在减法符号中,I 放在 V 或 X 之前,使其成为 IV(四)或 IX(九)。 同样,X 放在 L 或 C 之前,使其成为 XL 或 XC。

因此,减法符号中的符号是由两个符号组合而成的。 因此,让我们看看也包含减法符号的罗马数字。

SYMBOL Number
I 1
IV 4
V 5
IX 9
X 10
XL 40
L 50
XC 90
C 100
CD 400
D 500
CM 900
M 1000

在 C++ 中将十进制数转换为罗马数字

将整数转换为罗马数字的过程如下:

  1. 重复以下过程,直到给定的十进制数变为零。
  2. 我们需要按照 1000、900、500、400、100、90、50、40、10、9、5、4、1 的顺序将十进制数与基数进行比较。
  3. 如果基值小于或等于给定的小数(最大基值),则将小数除以基值。
  4. 现在,在变量中附加基值的相应符号,即商次数。 例如:商出来的结果是3,底数是10,那么10对应的表示,即X,在答案中会重复三次为XXX。
  5. 但是,余数将成为进一步划分的新数字。
  6. 在十进制数变为零之前附加符号的变量包含答案。

让我们使用上述算法将数字 2954 作为要转换为罗马数字的十进制数。

输出:

MMCMLIV
Explanation:

第一阶段:

  1. 最初,十进制数是 2954。
  2. 由于2954>=1000,最大基数对应1000。
  3. 2954 除以 1000 得到商 = 2,余数 = 954。由于 1000 对应的符号是 M,因此将重复两次。
  4. 因此,目前的结果等于 MM。
  5. 余数成为执行进一步划分的新数字。

第二阶段:

  1. 现在,数字变成了 954
  2. 与基值1000>954>=900比较。 因此,最大基数为900。
  3. 954除以900得到商=1,余数=54。由于900对应的符号是CM,所以会追加一次。
  4. 因此,结果现在变为 MMCM。
  5. 余数成为执行进一步划分的新数字。

第三阶段:

  1. 现在,这个数字变成了 54。
  2. 与基值90>54>=50比较。 因此,最大基数为50。
  3. 54除以50得到商=1,余数=4。由于50对应的符号是L,所以会追加一次。
  4. 因此,结果现在变为 MMCML。
  5. 余数成为执行进一步划分的新数字。

第四阶段:

  1. 现在,数字变成了 4。
  2. 与基值相比较5>4>=4。 因此,最大基数为4。
  3. 4 除以 4 得到商 = 1 和余数 = 0。由于 4 对应的符号是 IV,因此将追加一次。
  4. 因此,结果现在变为 MMCMLIV。
  5. 现在,由于余数变为零,迭代将停止,我们得到了所需的答案。
  6. 将十进制数转换为罗马数字的 C++ 代码示例

让我们看一个在 C++ 中将十进制数转换为罗马数字的代码示例。

#include <bits/stdc++.h>
using namespace std;

int subDig(char n1, char n2, int i, char c[]) {
        c[i++] = n1;
        c[i++] = n2;
        return i;
}


int digit(char ch, int n, int i, char c[]) {
    for(int j = 0; j < n; j++) {
        c[i++] = ch;
    }
    return i;
}

int convertRoman(int num)
{
    char c[10001];
    int i=0;
    while(num!=0){
        if(num >= 1000) {
            i = digit('M', num/1000, i, c);
            num = num%1000;
        }
        else if(num >= 500) {
            if (num < 900) {
                i = digit('D', num/500, i, c);
                num = num%500;
            }
            else {
                i = subDig('C', 'M', i, c);
                num = num%100;
            }
        }
        else if (num >= 100) {
            if (num < 400) {
                i = digit('C', num/100, i, c);
                num = num%100;
            }
            else{
                    i = subDig('C', 'D', i, c);
                    num = num%100;
            }
        }
        else if (num >= 50) {
            if (num < 90) {
                i = digit('L', num/50, i, c);
                num = num%50;
            }
            else {
                i = subDig('X', 'C', i, c);
                num = num % 10;
            }
        }
        else if (num >= 10) {
            if (num < 40) {
                i = digit('X', num/10, i, c);
                num = num%10;
            }
            else {
                    i = subDig('X', 'L', i, c);
                    num = num%10;
            }
        }
        else if (num >= 5) {
            if (num < 9) {
                i = digit('V', num/5, i, c);
                num = num%5;
            }
            else {
                i = subDig('I', 'X', i, c);
                num = 0;
            }
        }
        else if (num >= 1) {
            if (num < 4) {
                i = digit('I', num, i, c);
                num = 0;
            }
            else{
                i = subDig('I', 'V', i, c);
                num = 0;
            }
        }
    }


    for (int j = 0; j < i; j++) {
        cout<<c[j];
    }
}

int main()
{
    int number = 2954;

    convertRoman(number);

    return 0;
}

输出结果:

MMCMLIV

在上面的代码中,我们使用 if/else 条件将数字 num 与基值进行比较,并在此基础上将相应的变量添加到答案中。

但是,减法符号后面的数字已使用 subDig 函数单独处理,其中两个字母符号已添加到答案中。

上面讨论的代码很长; 因此,让我们讨论一种不同的方法,我们的代码归结为比之前讨论的要短得多。

方法二

这种方法基于将基值及其对应的符号分别存储在数组中并在循环时使用它们。

让我们看看相同的代码。

#include <bits/stdc++.h>
using namespace std;


int convertRoman(int num)
{
    int base_values[] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    string symbols[] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
    int i=12;
    while(num>0)
    {
        int quot = num/base_values[i];
        num = num%base_values[i];
        while(quot--){
            cout<<symbols[i];
        }
        i--;
    }
}
int main()
{
    int number = 2543;
    convertRoman(number);
    return 0;
}

输出结果:

MMDXLIII

在上面的代码中,我们将基值和它们对应的符号存储在一个数组中,然后将数字与基值按降序进行比较。

之后,将数字除以最大基数,求出商和余数。 现在,使用 while 循环多次打印相应的符号。


总结

在本文中,我们讨论了将十进制数转换为罗马数。 罗马数字是一种用符号表示十进制数的方法。

罗马数字按降序排列,从左到右。 然而,在少数情况下,我们使用减法符号,其中较小的符号写在较大的符号之前。

这些情况出现在数字 4 和 9 中,并在本文中进行了解释。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C++ 中通过掷骰子生成随机值

发布时间:2023/04/09 浏览次数:169 分类:C++

本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。

在 C++ 中使用模板的链表

发布时间:2023/04/09 浏览次数:158 分类:C++

本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。

在 C++ 中添加定时延迟

发布时间:2023/04/09 浏览次数:142 分类:C++

本教程将为你提供有关在 C++ 程序中添加定时延迟的简要指南。这可以使用 C++ 库为我们提供的一些函数以多种方式完成。

在 C++ 中创建查找表

发布时间:2023/04/09 浏览次数:155 分类:C++

本文重点介绍如何创建查找表及其在不同场景中的用途。提供了三个代码示例以使理解更容易,并附有代码片段以详细了解代码。

如何在 C++ 中把字符串转换为小写

发布时间:2023/04/09 浏览次数:63 分类:C++

介绍了如何将 C++ std::string 转换为小写的方法。当我们在考虑 C++ 中的字符串转换方法时,首先要问自己的是我的输入字符串有什么样的编码

如何在 C++ 中确定一个字符串是否是数字

发布时间:2023/04/09 浏览次数:163 分类:C++

本文介绍了如何检查给定的 C++ 字符串是否是数字。在我们深入研究之前,需要注意的是,以下方法只与单字节字符串和十进制整数兼容。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便