亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現羅馬數字轉化成整數

發布時間:2021-07-13 13:46:05 來源:億速云 閱讀:232 作者:chen 欄目:開發技術

本篇內容介紹了“C++怎么實現羅馬數字轉化成整數”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Roman to Integer 羅馬數字轉化成整數

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.


羅馬數轉化成數字問題,我們需要對于羅馬數字很熟悉才能完成轉換。以下截自百度百科:

羅馬數字是最早的數字表示方式,比阿拉伯數字早2000多年,起源于羅馬。

如今我們最常見的羅馬數字就是鐘表的表盤符號:Ⅰ,Ⅱ,Ⅲ,Ⅳ(IIII),Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ……

對應阿拉伯數字(就是現在國際通用的數字),就是1,2,3,4,5,6,7,8,9,10,11,12。(注:阿拉伯數字其實是古代印度人發明的,后來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯數字。)

I - 1

V - 5

X - 10

L - 50

C - 100 

D - 500

M - 1000

1、相同的數字連寫,所表示的數等于這些數字相加得到的數,如:Ⅲ = 3;

2、小的數字在大的數字的右邊,所表示的數等于這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12;

3、小的數字,(限于Ⅰ、X 和C)在大的數字的左邊,所表示的數等于大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9;

4、正常使用時,連寫的數字重復不得超過三次。(表盤上的四點鐘“IIII”例外)

5、在一個數的上面畫一條橫線,表示這個數擴大1000倍。

有幾條須注意掌握:

1、基本數字Ⅰ、X 、C 中的任何一個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用一個。

2、不能把基本數字V 、L 、D 中的任何一個作為小數放在大數的左邊采用相減的方法構成數目;放在大數的右邊采用相加的方式構成數目,只能使用一個。

3、V 和X 左邊的小數字只能用Ⅰ。

4、L 和C 左邊的小數字只能用X。

5、D 和M 左邊的小數字只能用C。

而這道題好就好在沒有讓我們來驗證輸入字符串是不是羅馬數字,這樣省掉不少功夫。需要用到 HashMap 數據結構,來將羅馬數字的字母轉化為對應的整數值,因為輸入的一定是羅馬數字,那么只要考慮兩種情況即可:

第一,如果當前數字是最后一個數字,或者之后的數字比它小的話,則加上當前數字。

第二,其他情況則減去這個數字。

解法一:

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;
    }
};

我們也可以每次跟前面的數字比較,如果小于等于前面的數字,先加上當前的數字,比如 "VI",第二個字母 'I' 小于第一個字母 'V',所以要加1。如果大于的前面的數字,加上當前的數字減去二倍前面的數字,這樣可以把在上一個循環多加數減掉,比如 "IX",我們在 i=0 時,加上了第一個字母 'I' 的值,此時結果 res 為1。當 i=1 時,字母 'X' 大于前一個字母 'I',這說明前面的1是要減去的,而由于前一步不但沒減,還多加了個1,所以此時要減去2倍的1,就是減2,所以才能得到9,整個過程是 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++怎么實現羅馬數字轉化成整數”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

台北市| 亚东县| 色达县| 红桥区| 桦甸市| 辛集市| 阿瓦提县| 青神县| 丘北县| 黑河市| 临城县| 连州市| 辛集市| 安乡县| 大连市| 正安县| 湟源县| 宝山区| 茌平县| 通城县| 灌阳县| 米泉市| 华亭县| 巴里| 阿荣旗| 成都市| 遂平县| 全州县| 永修县| 临西县| 比如县| 潜江市| 张家川| 南昌县| 襄汾县| 宣威市| 鸡西市| 瑞丽市| 穆棱市| 花垣县| 阿勒泰市|