首页 > 代码库 > LeetCode 012 Integer to Roman

LeetCode 012 Integer to Roman

【题目】


Given an integer, convert it to a roman numeral.

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


【题意】

给定一个整数,将其表示成罗马数字


【思路】

罗马数字中只使用如下七个基值字母:M,D,C,L,X,V,I,分别用来表示1000、500、100、50、10、5、1。
罗马数组数规则:
基本数字Ⅰ、X 、C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能用一个。
不能把基本数字V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目,只能使用一个。
V 和X 左边的小数字只能用Ⅰ。
L 和C 左边的小数字只能用X。
D 和M 左边的小数字只能用C。


【代码】

class Solution {
public:
    string intToRoman(int num) {
		// 考虑>1000的情况
		string romStr = "";			//转换后的罗马字符串
		int fac = num / 1000;		//1000的个数
		int bas = num % 1000;		//表示完千位数后的余数
		for(int k=0; k<fac; k++)	//有几个1000,就用几个M表示
			romStr += "M";
		num = bas;					//剩余需要转换的数
		// 考虑500<x<1000的情况
		fac = num / 100;			//看看有多少个100需要表示
		bas = num % 100;			//计算余下的二位数
		if(fac == 9){				//注意900使用1000-100来表示,即CM
			romStr += "CM";
		}
		else if(fac >= 5){			//注意当num>500时,500是一个界,需要先表示500,大于500的部分,在下面处理
			romStr += "D";
			bas = num % 500;		//获得大于500的部分
		}
		else if(fac == 4){			//400需要特殊表示即500-100
			romStr += "CD";
		}
		else{						//100,200,300 使用对应个数的C转换
			for(int k=0; k<fac; k++)
				romStr += "C";
		}
		num = bas;
		// 考虑100-500的情况【这一部分是用于处理上一步>500的部分,如果上一步本身num是小于500的,则这一部分实际上是不起作用的】
		fac = num / 100;
		bas = num % 100;
		if(fac == 4){
			romStr += "CD";
		}
		else{
			for(int k=0; k<fac; k++)
				romStr += "C";
		}
		num = bas;
		// 考虑50-100的情况	【下面的情况和500-1000的情况类似,不再展开】
		fac = num / 10;
		bas = num % 10;
		if(fac == 9){
			romStr += "XC";
		}
		else if(fac >= 5){
			romStr += "L";
			bas = num % 50;
		}
		else if(fac == 4){
			romStr += "XL";
		}
		else{
			for(int k=0; k<fac; k++)
				romStr += "X";
		}
		num = bas;
		// 考虑10-50的情况
		fac = num / 10;
		bas = num % 10;
		if(fac == 4){
			romStr += "XL";
		}
		else{
			for(int k=0; k<fac; k++)
				romStr += "X";
		}
		num = bas;
		// 考虑5-10的情况
		fac = num;
		bas = 0;
		if(fac == 9){
			romStr += "IX";
		}
		else if(fac >= 5){
			romStr += "V";
			bas = num % 5;
		}
		else if(fac == 4){
			romStr += "IV";
		}
		else{
			for(int k=0; k<fac; k++)
				romStr += "I";
		}
		num = bas;
		// 考虑0-5的情况
		for(int k=0; k<num; k++)
			romStr += "I";

		return romStr;
    }
};