入力を文字列として受け取ってしまうのが楽だと思う!
問題概要
各桁の値が単調減少 (等しいはダメ) になっている数を 321-like 数と呼ぶことにする。
たとえば、971 や 5 は 321-like 数であるが、978 や 988 は 321-like 数ではない。
与えられた正の整数 が 321-like 数であるかどうかを判定せよ。
制約
メモ
int
型で受け取ってもよいが、各桁の値を取り出すのが面倒になってしまう (可能ではある)。
そこで、string
型の変数 N
で受け取ろう。そうすれば「左から 文字目の数値」を N[i]
で取得できる。なお、取得した値は正確には文字リテラルであることに注意。たとえば、N
= "972" のとき、N[0] = '9'
であって、N[0] = 9
ではない。
それでも、単調減少かどうかの判定は、文字リテラルのまま隣り合う要素同士の大小比較を行えばよい。
コード
#include <bits/stdc++.h> using namespace std; int main() { string N; cin >> N; // すべての i に対して、N[i] > N[i+1] であるべき! // よって、N[i] <= N[i+1] となる箇所が 1 個でもあったら false にする bool ok = true; for (int i = 0; i + 1 < N.size(); ++i) { if (N[i] <= N[i+1]) { ok = false; } } if (ok) cout << "Yes" << endl; else cout << "No" << endl; }