C - 入力チェック / Validation Editorial by leaf1415
文字列 \(S\) が問題文に記された二つの条件を満たすかどうかを判定します。 ここでは、以下の(1)、(2)の順番に判定していきます。
(1) 「先頭に不要な 0
がない」ことの判定
「先頭に不要な 0
がない」という条件を満たすか判定するには、文字列 \(S\) の先頭の文字が 0
かどうかを判定すれば良いです。
ただし、\(S\) が表す整数が \(0\) の場合(すなわち、\(S\) が \(1\) つの 0
のみからなる長さ \(1\) の文字列である場合)は、「不要な0
」ではないことに注意してください。
(2) 「\(L\) 以上 \(R\) 以下である」ことの判定
「\(L\) 以上 \(R\) 以下である」ことを判定するには、文字列 \(S\) を整数型の値に変換し、整数どうしの大小比較によって 「\(L\) 以上 \(R\) 以下である」かを判定するのが良いでしょう。
例えば、C++言語であれば、文字列型から整数型への変換には標準ライブラリのstol関数を用いることができます。
ただし、入力で与えられる文字列 \(S\) の長さは最大で \(100\) となるため、\(S\) が表す整数は、\(64\) bit整数型が表現できる上限値を超える可能性があります。使用する言語で多倍長整数型がサポートされていれば、これを用いるのも良いでしょう。 もし \(64\) bit整数型を用いる場合は、以下のような方法が考えられます:
入力で与えられる \(R\) の値は高々 \(10^9\) ですから、\(S\) が表す整数の桁数(すなわち、\(S\) の文字列としての長さ)が \(11\) 以上の場合は、
「 \(L\) 以上 \(R\) 以下である」を満たすことはありません。
よって、文字列 \(S\) の長さが \(11\) 以上の場合は No
を出力し、
\(S\) の長さが \(10\) 以下の場合にのみ、\(S\) が表す整数を \(64\) bit整数型に格納して、「 \(L\) 以上 \(R\) 以下である」ことを判定すれば良いです。
以下に、C++言語による実装例を記載します。
#include <iostream>
#include <string>
using namespace std;
string s;
int l, r;
int main(void)
{
cin >> s;
cin >> l >> r;
if(s == "0"){
if(l == 0) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
if(s[0] == '0' || s.size() >= 11){
cout << "No" << endl;
return 0;
}
long long n = stol(s);
if(l <= n && n <= r) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}
posted:
last update: