[伯俊]BOJ 4673 JAVA


質問する


BOJ 4673セルフサービス番号
セルフサービス番号は1949年にインドの数学者D.R.Kaprekarによって命名された.正の整数nについて、d(n)がnおよびnの各ビット数の関数を定義する.例えば、d(75)=75+7+5=87である.
正の整数nが与えられると、その数からn、d(n)、d(d(n)、d(d(d(n))、...無限数列を生成できます.
たとえば、33で始まると、次の数字は33+3+3=39、次の数字は39+3+9=51、次の数字は51+5+1=57となります.このようにして、次の数の列を生成できます.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
nをd(n)の生成者と呼ぶ.上の数列において、33は39の生成者、39は51の生成者、51は57の生成者である.生成者が1つより多い場合もあります.例えば、101には2つの構造関数(91および100)がある.
生成されていない数字を自動番号と呼びます.100未満のセルフサービス番号は全部で13個です.1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000以下のセルフ・サービス番号を出力するプログラムを作成します.

入力


なし.

しゅつりょく


10000以下の自己符号を行ごとに1つ追加する順序で出力します.

サンプルI/O



ソースコード

public class Main {
    private static final int N = 10001;
    private static boolean[] ans;

    public static void main(String[] args) {
        ans = new boolean[N];

        for (int i = 1; i < N; i++) {
            int idx = getNotSelfNum(i);
            if (idx < N) {
                ans[idx] = true; // true면 셀프넘버가 아닌 생성자가 있는 수
            }
        }

        for (int i = 1; i < N; i++) {
            if (!ans[i]) {
                System.out.println(i);
            }
        }
    }

    private static int getNotSelfNum(int num) {
        int sum = num;
        
        while (num > 0) {
            sum += num % 10; //1의 자리를 더한다.
            num /= 10; //1의 자리를 없앤다.
        }

        return sum;
    }
}

Comment


  • 関数とグローバルを学習しました.