<1 OJデイリー>ローマの-LeetCode 13.デジタル正の数

トピック:

次の7つを含むローマ数字文字:I、V、X、L、C、D及びM.

数字
I. 1
V. 5
X-10
L 50
C 100
D 500
M 1000は
、例えば、2、すなわち1.12、すなわちX + II、二つの平行XIIとして書き込まローマ数字II、のように書きます。27 XXVII、即ちXX + V + IIのように書きます。

一般的に、大量に右にローマ数字の数が少ないです。しかし、例外もある、例えば、4 IIIIを書きますが、IVはありません。左番号5番号1において、4得られた還元番号5で表される値に等しい多数の数。同様に、数9は、IXで表されます。この特別なルールは以下の6つのケースにのみ適用されます。

私は、左V(5)とX(10)上にあってもよく、及び4,9を表現します。
X Lは左(50)及びC(100)上に配置することができ、及び40及び90が示されています。 
Cは、400と900表すために、左側にD(500)とM(1000)上に配置することができます。
整数に変換するために、ローマ数字を考えます。入力は3999から1の範囲にあることを保証します。

例1:

入力: "III"
出力:3
例2:

入力: "IV"
出力:4
例3:

入力: "IX"
出力:9
例4:

入力: "LVIII"
出力:58の
説明:L = 50、V = 5 、III = 3
実施例5:

入力: "MCMXCIV"
出力:1994
説明:M = 1000、CM = 900 、XC = 90、IV = 4。

 

次のようにアイデアは以下のとおりです。

すべてのシーケンシャルは2つの値を読んで、前者が後者よりも小さい場合、それは6例があったことを示し、それは、前の値を引いた値を使用する必要があります。例えば:

S = "IV"。

値が前の値よりも大きい場合、通常の読み出し電流値とすることができるのに対し、この場合、VIは、値にすることができます

コード:

/ 13 ローマ.cppファイルを整数へデジタル:エントリポイントのコンソールアプリケーションを定義します。
//
 
の#include " stdafx.hを" 

の#include " STDLIB.H " 
int型読む(char型A);
 int型 romantoint(のchar *のS); 

int型読む(char型のA){
     スイッチ(A){
         ケース ' I 'リターン 1。;
         ケース ' V '復帰 。5 ;
         ケース ' X- '戻る 10 ケース ' L 'リターン 50 ;
        ケース C 返す 100 ケース D 返す 500 ケース M リターン 1000年デフォルト:のprintf(" !入力エラー\ N " );
                  リターン 0 ; 
    } 
} 

int型 romantoint(CHAR* S){
     int型 LEN = 0 int型 POS = 0 ;
    int型の合計= 0 ;
    int型の次= 0 ;
    以下のための(LEN = 0 ;!S [LEN] = ' \ 0 ' ; LEN ++ );
    一方、(!POS = LEN){ 
        のprintf(" POS:%Dを\ n " 、POS)。
        もし(S [POS + 1 ]!= ' \ 0 ' ){
             場合(読み取り(S [POS + 1 ])>読み取り(S [POS])){ 
                次の読み取り=(S [POS + 1 ]) - 読み取る(S [POS])。
                POS + = 2 ; 
                合計 + = 次;
                続け; 
            } 
        }  = (S [POS])を読み込みます。
        POS ++ ; 
        合計 + = 次; 
    } 
    戻り値の和。
} 
INT _tmain(INT ARGC、_TCHAR * ARGV [])
{ 
   
    チャー * STR =(CHAR *)のmalloc100 );
     // CHAR * STR = NULL;間違った用法 
    scanfの(" %S " 、STR);
     int型 NUM = romantoint(STR); 

    のprintf(" %のD " 、NUM); 
    システム(" PAUSE " )。       
     戻り 0 ; 
}

注1:

strは文字ポインタである、あなたはそれがスペースを使用することであるために適用する必要はありません、それは自然に間違って行くだろう。補正:
CHAR * STR =(チャー*)のmalloc(100);
scanfの( "%のS"、STR);
のprintf( "入力文字列の出力* STR =%S \ n"は 、STR)。

注2:

初期化:配列の定義は、コンパイル時に彼のためにメモリユニットを割り当て、彼は明確なアドレスを持っている、と文字ポインタ変数を定義する際に、それを初期化するのが最善である、そうでないポインタ変数の値が不確実なメモリセグメントを指します、プログラムを破壊します、

以下の方法が許可されています。

文字列str [10]。

scanf関数( "%sの"、STR ); // または文字列のコピー機能のコピー代入

次のような方法が推奨されません、それは危険です。

char * P; //ポインタ初期化されていない変数は、メモリ・セグメントは、不確実にポイント

scanf関数( "%sの"、P)。

以下のアプローチをお勧めします。

P =(CHAR *)のmalloc(10)。

scanf関数( "%sの" P); //文字列のコピー機能やコピー代入

 

おすすめ

転載: www.cnblogs.com/mhq-martin/p/11374662.html