白駿4673セルフクイズ(JAVA)


質問リンク

質問する


セルフサービス番号は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つ追加する順序で出力します.

に答える


非セルフ番号数を求める関数を直接実現した.(超ハードコーディング…)
public static int dr(int n) {
		int ans=n;
		if(n>=1000) {
			ans = n+(n%10)+(((n%100)-(n%10))/10)+(((n%1000)-(n%100))/100)+((n-(n%1000))/1000);
		}else if(n>=100){
			ans = n+(n%10)+(((n%100)-(n%10))/10)+((n-(n%100))/100);
		}else if(n>=10) {
			ans = n+(n%10)+((n-(n%10))/10);
		}else {
			ans=n*2;
		}
		return ans;
}
恥ずかしいと思って公開しないつもりでしたが、その時の情熱はプロの開発者でした

ソースコード

class Main{
	public static void main(String [] args) {
		int [] mr = new int[10000];
		boolean y = true;
		for(int i=1;i<10000;i++) {
			mr[i]=dr(i);
		}
		for(int i=1;i<10000;i++) {
			for(int j=0;j<10000;j++) {
				if(i==mr[j]){
					y=false;
					break;
				}
			}
			if(y) {
				System.out.println(i);
			}
			y=true;
		}
		
	}
    public static int dr(int n) {
		int ans=n;
		if(n>=1000) {
			ans = n+(n%10)+(((n%100)-(n%10))/10)+(((n%1000)-(n%100))/100)+((n-(n%1000))/1000);
		}else if(n>=100){
			ans = n+(n%10)+(((n%100)-(n%10))/10)+((n-(n%100))/100);
		}else if(n>=10) {
			ans = n+(n%10)+((n-(n%10))/10);
		}else {
			ans=n*2;
		}
		return ans;
	}
}