C++之整数转化为罗马数字(11)---《那些奇怪的算法》

16 篇文章 0 订阅
1 篇文章 0 订阅

参考:《one-day-one-leetcode》

要求:将整形数字转化为罗马数字,我们都知道罗马数字有7个,分别为I(1),V(5),X(10),L(50),C(100),D(500),M(1000),这有个弊端,就是我们需要限制我们的输入在1~3999内,因为大于3999或者小于1无法使用罗马数字表示!

代码实现:
1)_simple我们列举了所有可能出现的情况,然后进行相应的匹配,代码逻辑简单;
2)第二种我们按照分类情况进行讨论,逻辑上比较简单,但是代码实现比较冗余。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string intToRoman_simple(int num){
    int values[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    string numerals[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
    string str = "";
    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++){
        string str_t = "";
        while (num >= values[i]){
            num -= values[i];
            str_t += numerals[i];
        }
        str += str_t;
    }
    return str;
}
string intToRoman(int num){
    string str = "";
    string roman[7] = { "I", "V", "X",
        "L", "C", "D", "M" };
    int j = 0;
    while (num){
        string str_t = "";
        int temp = num % 10;
        if (temp < 4){
            int count = temp;
            while (count--){
                str_t += roman[j];
            }
        }
        else if (temp == 4){
            str_t += roman[j];
            str_t += roman[j + 1];
        }
        else if (temp >= 5 && temp <= 8){
            str_t += roman[j + 1];
            int count = temp - 5;
            while (count--){
                str_t += roman[j];
            }
        }
        else{
            str_t += roman[j];
            str_t += roman[j + 2];
        }
        str = str_t + str;
        cout << str_t << endl;
        cout << str << endl;
        cout << "==================" << endl;
        num /= 10;
        j = j + 2;
    }
    return str;

}
int main(){
    int num = 3745;
    cout << intToRoman_simple(num) << endl;
    return 0;
}

运行结果:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值