[20920/TDL]Self number:整数形式の処理と文字列形式の処理(標準4673)
2943 ワード
今日はselfnumberという問題をしました.
問題は以下の通りです.( 白駿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以下のセルフ・サービス番号を出力するプログラムを作成します.
以前に一度やった問題なので、前にやった方法よりも効率的なコードを書きたいです.
以前
次に、n生成されたすべてのd(n)を求め、対応するインデックス1に値を割り当てる.
最後に、値が1の場合はself numberではないので、1以外の値が出力される.
非常に複雑で、コードが直感的ではありません.
その後、今回のやり直しでは、文字列概念を使用しました.
各ビット数を1つずつ計算するのではなく、文字列で分割処理して計算します.
そのため、コードの可読性が良くなったと思います.
1行目のコードは次の行で、2行目のコードは1行目の結果です.
私はコードを書いたと思っていましたが、もっと読みやすくて、盲目的に計算するのではなく、効率的に答えました.これは間違った考えです.
整数型値を文字列に変更して整数に変換するプロセスは、すべてのプロセスで繰り返され、2番目のコードはコード長や毒性の面で優れていますが、アルゴリズムでは必要であり、時間、空間の複雑なグラフィックでは無効なコードになります.
次回もこの点を考慮して、コードを書きます.
問題は以下の通りです.( 白駿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以下のセルフ・サービス番号を出力するプログラムを作成します.
以前に一度やった問題なので、前にやった方法よりも効率的なコードを書きたいです.
以前
class SelfNumber {
public static void main(String []args) {
int[] arr = new int[10000];
int k;
for (int i=1;i<10000;i++) {
int val = 0;
if (i<10) {
val = i*2;
} else if (i<100) {
val = i + i/10 + i%10;
} else if (i<1000) {
int a = i/100;
int b = (i%100) / 10;
int c = i % 10;
val = i+a+b+c;
} else if (i<10000) {
int a=i/1000;
int b=(i%1000)/100;
int c=((i%1000)%100) / 10;
int d= i%10;
val = i+a+b+c+d;
}
if (val < 10000) {
arr[val] = 1;
}
}
for (int i=1;i<10000;i++) {
if (arr[i] != 1)
System.out.println(i);
}
}
}
頭を分けて考える.次に、n生成されたすべてのd(n)を求め、対応するインデックス1に値を割り当てる.
最後に、値が1の場合はself numberではないので、1以外の値が出力される.
非常に複雑で、コードが直感的ではありません.
その後、今回のやり直しでは、文字列概念を使用しました.
各ビット数を1つずつ計算するのではなく、文字列で分割処理して計算します.
そのため、コードの可読性が良くなったと思います.
public class Main {
public static void main(String[] args) {
int[] checkList = new int[10000];
for (int i=1; i<10000; i++) {
int check = i;
String str = i + "";
String[] eachNumbers = str.split("");
for (String eachNumber : eachNumbers) {
check += Integer.parseInt(eachNumber);
}
if (check < 10000)
checkList[check] = 1;
}
for (int i=1; i<10000; i++) {
if (checkList[i] != 1)
System.out.println(i);
}
}
}
しかし結果は以下の通り.1行目のコードは次の行で、2行目のコードは1行目の結果です.
私はコードを書いたと思っていましたが、もっと読みやすくて、盲目的に計算するのではなく、効率的に答えました.これは間違った考えです.
整数型値を文字列に変更して整数に変換するプロセスは、すべてのプロセスで繰り返され、2番目のコードはコード長や毒性の面で優れていますが、アルゴリズムでは必要であり、時間、空間の複雑なグラフィックでは無効なコードになります.
次回もこの点を考慮して、コードを書きます.
Reference
この問題について([20920/TDL]Self number:整数形式の処理と文字列形式の処理(標準4673)), 我々は、より多くの情報をここで見つけました https://velog.io/@ruthetum/200920-Self-number-정수-형태의-처리와-문자열-형태의-처리-백준-4673テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol