私はそれに与えられた数字が「 ハッピーナンバー 」であるかどうかを知らせるプログラムを作成しようとしています。幸せな数字を見つけるには、数字の各桁を2乗し、各桁の2乗の結果を加算する必要があります。
Pythonでは、次のようなものを使用できます。
SQUARE[d] for d in str(n)
しかし、Javaで数値の各桁を反復する方法を見つけることができません。ご存知のように、私はそれに慣れていないので、Java docs。
10を法とする演算を使用して右端の数値を取得し、その数値を10で除算して次の数値を取得できます。
_long addSquaresOfDigits(int number) {
long result = 0;
int tmp = 0;
while(number > 0) {
tmp = number % 10;
result += tmp * tmp;
number /= 10;
}
return result;
}
_
また、それを文字列に入れてそれをchar配列に変換し、Math.pow(charArray[i] - '0', 2.0);
のようなことを繰り返し処理することもできます
数値が次のように始まる整数であると仮定します。
int num = 56;
String strNum = "" + num;
int strLength = strNum.length();
int sum = 0;
for (int i = 0; i < strLength; ++i) {
int digit = Integer.parseInt(strNum.charAt(i));
sum += (digit * digit);
}
Javaで正数を数字に分割するのに最も速い方法はどれか、文字列とモジュロのどちらか
public static ArrayList<Integer> splitViaString(long number) {
ArrayList<Integer> result = new ArrayList<>();
String s = Long.toString(number);
for (int i = 0; i < s.length(); i++) {
result.add(s.charAt(i) - '0');
}
return result; // MSD at start of list
}
対
public static ArrayList<Integer> splitViaModulo(long number) {
ArrayList<Integer> result = new ArrayList<>();
while (number > 0) {
int digit = (int) (number % 10);
result.add(digit);
number /= 10;
}
return result; // LSD at start of list
}
Long.MAX_VALUE
を10,000,000回渡して各メソッドをテストすると、文字列バージョンは2.090秒、モジュロバージョンは2.334秒かかりました。 (Oracle Java 8)
それほど多くはありませんが、Stringの方が速いことに少し驚きました
上記の例では、以下を使用できます。
int digit = Character.getNumericValue(strNum.charAt(i));
の代わりに
int digit = Integer.parseInt(strNum.charAt(i));