Roman to Integer and Integer to Roman

本文介绍了一种使用C++实现的罗马数字到整数的转换方法,并提供了详细的代码示例。此外,还展示了如何将整数转换回罗马数字,帮助读者理解转换背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Roman to Integer

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

Subscribe to seewhich companies asked this question.

Solving problemsusing C++

 

class Solution{

public:

    int romanToInt(string s) {

        // Add yours code

    }

};

 

/*
Author:杨柳
Date:2017/5/4 
IDE:DEV-c++ 
罗马数字规则:
1, 罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。
罗马数字中没有"0"。
2, 重复次数:一个罗马数字最多重复3次。
3, 右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
4, 左减的数字有限制,仅限于I、X、C,且放在大数的左边只能用一个。
(*) V 和 X 左边的小数字只能用Ⅰ。
(*) L 和 C 左边的小数字只能用X。
(*) D 和 M 左 边的小数字只能用C。
用户输入一个数字,遍历这个数字,sum计算和,如果前一个数字大于后一个直接相加,如果小于后一个数字,加和用sum减去前一个较小的数字的两倍 

例如:MCMLXX 代表1970 
M>C sum=1000+100  C<M sum=sum+1000-100*2  M>L sum=sum+50 L>X sum=sum+20 X=X sum=sum+20 
*/
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
class Solution {  
public:  
    int romanToInt(string s) {  
	int sum=changeint(s[0]);      
        for (int i = 0; i < s.length()-1; i++) {  
            if (changeint(s[i]) < changeint(s[i+1])) {  
                sum += changeint(s[i+1]) - 2 * changeint(s[i]);  // 如果i比i+1小的话,则将总和sum减去i这个地方数的两倍,同时加上i+1
            } 
			else {  
                sum += changeint(s[i+1]);   // 如果,i比i+1大的话,直接相加
            }  
        }  
        return sum;
       
    }       
    int changeint(char ch) {  
        switch (ch) {  
            case 'I': return 1;  
            case 'V': return 5;  
            case 'X': return 10;  
            case 'L': return 50;  
            case 'C': return 100;  
            case 'D': return 500;  
            case 'M': return 1000;  
        }  
    }
	// 阿拉伯数字转罗马数字
	/*string IntToroman(int num){
        string sum;
       if (num >= 1000) {
            sum += changeroman(num - num % 1000);
            num %= 1000;
        }
        if (num >= 100) {
            sum += changeroman(num - num % 100);
            num %= 100;
        }
        if (num >= 10) {
            sum += changeroman(num - num % 10);
            num %= 10;
        }
        
        sum += changeroman(num);
        
        return sum;
	  	
	  }
	  
	string changeroman(int num) {  
       switch(num) {
            case 1: return "I";
            case 2: return "II";
            case 3: return "III";
            case 4: return "IV";
            case 5: return "V";
            case 6: return "VI";
            case 7: return "VII";
            case 8: return "VIII";
            case 9: return "IX";
            case 10: return "X";
            case 20: return "XX";
            case 30: return "XXX";
            case 40: return "XL";
            case 50: return "L";
            case 60: return "LX";
            case 70: return "LXX";
            case 80: return "LXXX";
            case 90: return "XC";
            case 100: return "C";
            case 200: return "CC";
            case 300: return "CCC";
            case 400: return "CD";
            case 500: return "D";
            case 600: return "DC";
            case 700: return "DCC";
            case 800: return "DCCC";
            case 900: return "CM";
            case 1000: return "M";
            case 2000: return "MM";
            case 3000: return "MMM";
        }
    }*/
    
    //阿拉伯数字转罗马数字(方法二)
    
    string IntToroman(int num){
	char ch[][10] ={ "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" , "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" ,
            "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" , "", "M", "MM", "MMM", "", "",};

    string sum = ch[3][num / 1000] + ch[2][num % 1000 / 100] +ch[1][num % 100 / 10] +ch[0][num % 10];
    return sum;
	}
}; 
int main(){
	Solution sl;
	string str;
	int num; 
	cout<<"罗马字符转化为阿拉伯数字"<<endl;
	cout<<"请输入一个罗马数字:"<<endl;
	cin>>str;
	cout<<"罗马数字所对应的阿拉伯数字为:"<<endl; 
	cout<<sl.romanToInt(str)<<endl;
    cout<<"请输入一个阿拉伯数字:"<<endl;
	cin>>num;
	cout<<"阿拉伯数字所对应的罗马数字为:"<<endl; 
	cout<<sl.IntToroman(num);

}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值