這篇文章主要講解了“C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)”吧!
創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供惠東企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、html5、小程序制作等業(yè)務(wù)。10年已為惠東眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II in Roman numeral, just two one"s added together. Twelve is written as, XII, which is simply X+ II. The number twenty seven is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
I can be placed before V (5) and X(10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III"
Output: 3
Example 2:
Input: "IV"
Output: 4
Example 3:
Input: "IX"
Output: 9
Example 4:
Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
羅馬數(shù)轉(zhuǎn)化成數(shù)字問(wèn)題,我們需要對(duì)于羅馬數(shù)字很熟悉才能完成轉(zhuǎn)換。以下截自百度百科:
羅馬數(shù)字是最早的數(shù)字表示方式,比阿拉伯?dāng)?shù)字早2000多年,起源于羅馬。
如今我們最常見(jiàn)的羅馬數(shù)字就是鐘表的表盤(pán)符號(hào):Ⅰ,Ⅱ,Ⅲ,Ⅳ(IIII),Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ……
對(duì)應(yīng)阿拉伯?dāng)?shù)字(就是現(xiàn)在國(guó)際通用的數(shù)字),就是1,2,3,4,5,6,7,8,9,10,11,12。(注:阿拉伯?dāng)?shù)字其實(shí)是古代印度人發(fā)明的,后來(lái)由阿拉伯人傳入歐洲,被歐洲人誤稱(chēng)為阿拉伯?dāng)?shù)字。)
I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000
1、相同的數(shù)字連寫(xiě),所表示的數(shù)等于這些數(shù)字相加得到的數(shù),如:Ⅲ = 3;
2、小的數(shù)字在大的數(shù)字的右邊,所表示的數(shù)等于這些數(shù)字相加得到的數(shù), 如:Ⅷ = 8;Ⅻ = 12;
3、小的數(shù)字,(限于Ⅰ、X 和C)在大的數(shù)字的左邊,所表示的數(shù)等于大數(shù)減小數(shù)得到的數(shù),如:Ⅳ= 4;Ⅸ= 9;
4、正常使用時(shí),連寫(xiě)的數(shù)字重復(fù)不得超過(guò)三次。(表盤(pán)上的四點(diǎn)鐘“IIII”例外)
5、在一個(gè)數(shù)的上面畫(huà)一條橫線,表示這個(gè)數(shù)擴(kuò)大1000倍。
有幾條須注意掌握:
1、基本數(shù)字Ⅰ、X 、C 中的任何一個(gè),自身連用構(gòu)成數(shù)目,或者放在大數(shù)的右邊連用構(gòu)成數(shù)目,都不能超過(guò)三個(gè);放在大數(shù)的左邊只能用一個(gè)。
2、不能把基本數(shù)字V 、L 、D 中的任何一個(gè)作為小數(shù)放在大數(shù)的左邊采用相減的方法構(gòu)成數(shù)目;放在大數(shù)的右邊采用相加的方式構(gòu)成數(shù)目,只能使用一個(gè)。
3、V 和X 左邊的小數(shù)字只能用Ⅰ。
4、L 和C 左邊的小數(shù)字只能用X。
5、D 和M 左邊的小數(shù)字只能用C。
而這道題好就好在沒(méi)有讓我們來(lái)驗(yàn)證輸入字符串是不是羅馬數(shù)字,這樣省掉不少功夫。需要用到 HashMap 數(shù)據(jù)結(jié)構(gòu),來(lái)將羅馬數(shù)字的字母轉(zhuǎn)化為對(duì)應(yīng)的整數(shù)值,因?yàn)檩斎氲囊欢ㄊ橇_馬數(shù)字,那么只要考慮兩種情況即可:
第一,如果當(dāng)前數(shù)字是最后一個(gè)數(shù)字,或者之后的數(shù)字比它小的話,則加上當(dāng)前數(shù)字。
第二,其他情況則減去這個(gè)數(shù)字。
解法一:
class Solution { public: int romanToInt(string s) { int res = 0; unordered_mapm{{"I", 1}, {"V", 5}, {"X", 10}, {"L", 50}, {"C", 100}, {"D", 500}, {"M", 1000}}; for (int i = 0; i < s.size(); ++i) { int val = m[s[i]]; if (i == s.size() - 1 || m[s[i+1]] <= m[s[i]]) res += val; else res -= val; } return res; } };
我們也可以每次跟前面的數(shù)字比較,如果小于等于前面的數(shù)字,先加上當(dāng)前的數(shù)字,比如 "VI",第二個(gè)字母 "I" 小于第一個(gè)字母 "V",所以要加1。如果大于的前面的數(shù)字,加上當(dāng)前的數(shù)字減去二倍前面的數(shù)字,這樣可以把在上一個(gè)循環(huán)多加數(shù)減掉,比如 "IX",我們?cè)?i=0 時(shí),加上了第一個(gè)字母 "I" 的值,此時(shí)結(jié)果 res 為1。當(dāng) i=1 時(shí),字母 "X" 大于前一個(gè)字母 "I",這說(shuō)明前面的1是要減去的,而由于前一步不但沒(méi)減,還多加了個(gè)1,所以此時(shí)要減去2倍的1,就是減2,所以才能得到9,整個(gè)過(guò)程是 res = 1 + 10 - 2 = 9,參見(jiàn)代碼如下:
解法二:
class Solution { public: int romanToInt(string s) { int res = 0; unordered_mapm{{"I", 1}, {"V", 5}, {"X", 10}, {"L", 50}, {"C", 100}, {"D", 500}, {"M", 1000}}; for (int i = 0; i < s.size(); ++i) { if (i == 0 || m[s[i]] <= m[s[i - 1]]) res += m[s[i]]; else res += m[s[i]] - 2 * m[s[i - 1]]; } return res; } };
感謝各位的閱讀,以上就是“C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!