web-dev-qa-db-ja.com

数値の各桁を反復する

私はそれに与えられた数字が「 ハッピーナンバー 」であるかどうかを知らせるプログラムを作成しようとしています。幸せな数字を見つけるには、数字の各桁を2乗し、各桁の2乗の結果を加算する必要があります。

Pythonでは、次のようなものを使用できます。

SQUARE[d] for d in str(n)

しかし、Javaで数値の各桁を反復する方法を見つけることができません。ご存知のように、私はそれに慣れていないので、Java docs。

16
Isaac Lewis

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);のようなことを繰り返し処理することもできます

22
Argote

数値が次のように始まる整数であると仮定します。

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);
}
5
yavoh

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の方が速いことに少し驚きました

1
Spangen

上記の例では、以下を使用できます。

int digit = Character.getNumericValue(strNum.charAt(i));

の代わりに

int digit = Integer.parseInt(strNum.charAt(i));
0
D.Charan