-LeetCode 13 . ローマ数字

8335 ワード

タイトル:
ローマ数字には、I、V、X、L、C、D、Mの7文字が含まれています.
文字値I 1 V 5 X 10 L 50 C 100 D 500 M 1000は、例えば、ローマ数字2をIIと書くと、2つの並列の1となる.12はXIIと書きます.つまりX+IIです.27 XXVIIと書くと、XX+V+IIとなります.
通常、ローマ数字の中で小さい数字は大きな数字の右側にあります.しかし、例えば4はIIIではなくIVと書くという特例もある.数字1は数字5の左側にあり、表す数は大数5から小数1を減らした数値4に等しい.同様に、数字9はIXとして表される.この特殊なルールは、次の6つの場合にのみ適用されます.
IはV(5)とX(10)の左側に置いて4と9を表すことができる.XはL(50)とC(100)の左側に置いて40と90を表すことができる.CはD(500)とM(1000)の左側に置いて400と900を表すことができる.ローマ数字を指定し、整数に変換します.入力は1~3999の範囲であることを確認します.
例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";
この場合、V-Iでいいから値まで、逆に、前の値が後の値より大きい場合は、現在の値を正常に読み取ればよい
コード:
/ 13.       .cpp :              。
//

#include "stdafx.h"

#include "stdlib.h"
int read(char a);
int romantoint(char *s);

int read(char a){
    switch (a){
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        default:  printf("Input Error!
"); return 0; } } int romantoint(char *s){ int len = 0; int pos = 0; int sum = 0; int next = 0; for(len = 0;s[len]!='\0';len++); while(pos != len){ printf("pos:%d
",pos); if(s[pos+1] != '\0'){ if(read(s[pos+1])>read(s[pos])){ next = read(s[pos+1])-read(s[pos]); pos += 2; sum += next; continue; } } next = read(s[pos]); pos ++; sum += next; } return sum; } int _tmain(int argc, _TCHAR* argv[]) { char *str = (char*)malloc(100); // char *str = NULL; scanf("%s",str); int num =romantoint(str); printf("%d",num); system("pause"); return 0; }

注意1:
strは文字ポインタで、スペースを申請していないので、自然にエラーが発生します.修正:char*str=(char*)malloc(100);scanf("%s",str);printf(「入力文字列*str=%sを出力」,str);
注意2:
初期化:コンパイル時にメモリユニットを割り当て、特定のアドレスを持つ配列を定義します.文字ポインタ変数を定義する場合は、初期化したほうがいいです.そうしないと、ポインタ変数の値が不確定なメモリセグメントを指し、プログラムが破壊されます.
次の方法で許可されます.
char str[10];
scanf("%s", str);//または文字列コピー関数を使用してコピー割り当てを行う
以下の方法は推奨されず、危険です.
char *p;//ポインタ変数は初期化されず、不確定なメモリセグメントを指します.
scanf("%s", p);
以下の方法が推奨されています.
p = (char *)malloc(10);
scanf("%s", p);//または文字列コピー関数を使用してコピー割り当てを行う
 
転載先:https://www.cnblogs.com/mhq-martin/p/11374662.html