Official

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: