-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でいいから値まで、逆に、前の値が後の値より大きい場合は、現在の値を正常に読み取ればよい
コード:
注意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
ローマ数字には、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