溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)

發(fā)布時(shí)間:2022-03-28 10:33:23 來源:億速云 閱讀:232 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)”吧!

Roman to Integer 羅馬數(shù)字轉(zhuǎn)化成整數(shù)

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ù)字問題,我們需要對(duì)于羅馬數(shù)字很熟悉才能完成轉(zhuǎn)換。以下截自百度百科:

羅馬數(shù)字是最早的數(shù)字表示方式,比阿拉伯?dāng)?shù)字早2000多年,起源于羅馬。

如今我們最常見的羅馬數(shù)字就是鐘表的表盤符號(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ā)明的,后來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯?dāng)?shù)字。)

I - 1

V - 5

X - 10

L - 50

C - 100 

D - 500

M - 1000

1、相同的數(shù)字連寫,所表示的數(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í),連寫的數(shù)字重復(fù)不得超過三次。(表盤上的四點(diǎn)鐘“IIII”例外)

5、在一個(gè)數(shù)的上面畫一條橫線,表示這個(gè)數(shù)擴(kuò)大1000倍。

有幾條須注意掌握:

1、基本數(shù)字Ⅰ、X 、C 中的任何一個(gè),自身連用構(gòu)成數(shù)目,或者放在大數(shù)的右邊連用構(gòu)成數(shù)目,都不能超過三個(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。

而這道題好就好在沒有讓我們來驗(yàn)證輸入字符串是不是羅馬數(shù)字,這樣省掉不少功夫。需要用到 HashMap 數(shù)據(jù)結(jié)構(gòu),來將羅馬數(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_map<char, int> m{{"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",這說明前面的1是要減去的,而由于前一步不但沒減,還多加了個(gè)1,所以此時(shí)要減去2倍的1,就是減2,所以才能得到9,整個(gè)過程是 res = 1 + 10 - 2 = 9,參見代碼如下:

解法二:

class Solution {
public:
    int romanToInt(string s) {
        int res = 0;
        unordered_map<char, int> m{{"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)過本文的學(xué)習(xí)后,相信大家對(duì)C++如何實(shí)現(xiàn)羅馬數(shù)字轉(zhuǎn)化成整數(shù)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI