Official

D - 326-like Numbers Editorial by kyopro_friends


最も自然な方針は次のようなものです。

for i=n to 919:
  if i が 326-like number:
    print(i)
    exit

与えられた数が326-like numberであるかどうかを判定するには、各位の数字を得る必要があります。次の 2 種類の方法が考えられます。

  1. 計算により求める方法
    整数 \(n\) が与えられたとき、百の位は \(\left\lfloor \frac{n}{100}\right\rfloor \bmod 10\)、十の位は \(\left\lfloor \frac{n}{10} \right\rfloor \bmod 10\)、一の位は \(n \bmod 10\) により得ることができます。
  2. 文字列変換により求める方法
    \(3\) 桁の整数 \(n\) が与えらえたとき、\(n\) を文字列に変換したものを \(s\) とすると、百の位は \(s\)\(1\) 文字目、十の位は \(s\)\(2\) 文字目、一の位は \(s\)\(3\) 文字目として得ることができます。なお、多くの言語では、この方法で得られるものは数値ではなく文字であることに注意してください。

以上を実装することで 326-like number の判定を行うことができます。

実装例(C++) 計算による方法

#include<bits/stdc++.h>
using namespace std;

bool check(int n){
  int c100=n/100;
  int c10=n/10%10;
  int c1=n%10;
  return c100*c10==c1;
}

int main(){
  int n;
  cin >> n;
  for(int i=n;i<=919;i++){
    if(check(i)){
      cout << i << endl;
      return 0;
    }
  }
}

実装例(Python) 文字列変換による方法

def check(n):
  s=str(n)
  c100=int(s[0])
  c10=int(s[1])
  c1=int(s[2])
  return c100*c10==c1

N=int(input())
for i in range(N,919+1):
  if check(i):
    print(i)
    exit()

この他、各位の数を最初から別のfor文に書くという方法もあります。

実装例(Python)

N=int(input())
for c100 in range(1,10):
  for c10 in range(10):
    for c1 in range(10):
      x=c100*100+c10*10+c1
      if x>=N and c100*c10==c1:
        print(x)
        exit()

posted:
last update: