Coding_Gamesメモ_Happy_Numbers

Coding_Gamesメモ_Happy_Numbers

javaの学習にCoding_Games を知り、学習の記録としてメモ。
To debug:

System.err.println( );

を使うとデバックしやすくなる。(エラー出力は評価に影響しない)

内容

ある計算式を繰り返し使い、答えが1になる数字を探す

ルール

ある数字を桁ごとに2乗して、合計し、1になるかループするまで繰り返す
1になるならハッピーナンバーとして出力
1以外でループするならアンハッピーナンバーとして出力

例 23 → 22+32=13 → 12+32=10 → 12+02=1
24 → 22+42=20 → 22+02=4 → 42=16 → 12+62=37 → 32+72=58 → 52+82=89 → 82+92=145 → 12+42+52=42 → 42+22=20(loop)

インプット

1行目 テストする回数(N)
2行目から テストを行う数

アウトプット

テストを行った数がハッピーナンバーなら 数字 :)
アンハッピーナンバーなら 数字 :( をテスト回数分、改行区切りで出力

使用したクラス

String

(String) = String.substring(x,y)
文字列の一部をコピーする。
x,yはint型
xがコピー開始位置、yは終了位置、yが指定されていなければ最後まで指定したのと同じ。

(String) = String.valueOf(x);
x をStringの文字列として出力( String.valueOf(123) → "123" )

Integer

(static int) = Integer.parseInt(str)
数字を表す文字列str をint に変換する
valueOf との違いはparseInt は基本のデータ型のint を出力し、valueOf はラッパークラスのInteger を出力する

Math

(double) = Math.pow((double) a , (double) b)
ab a のb 乗

ArrayList

ArrayList<型> al = new ArrayList<型>()
型には基本のデータ型(intなど)は使えない
ラッパークラスを使う

(boolean) = ArrayList.add(x)
x をリストの最後に追加

(boolean) = ArrayList.contains( x )
x がリストに含まれているか調べる

考え方

何回計算すればいいか分からないのでwhile や再帰関数を使う
入力は最大26桁、int(最大10桁 232/2) やlong(最大19桁 264/2) では足りない
1度計算を行うと最大でも2025((92) *25) になるのでintの範囲に収まる

Coding_Games:https://www.codingame.com/
String (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html
Integer (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html
Math (Java Platform SE 8) - Oracle Cloud:http://docs.oracle.com/javase/jp/8/docs/api/java/lang/Math.html
ArrayList (Java Platform SE 8) - Oracle Cloud:https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html