Итерация по каждой цифре в числе - PullRequest
13 голосов
/ 16 февраля 2011

Я пытаюсь создать программу, которая сообщит, является ли присвоенное ей число " Счастливое число " или нет.Чтобы найти счастливое число, необходимо, чтобы каждая цифра в числе была квадратом, и результат квадрата каждой цифры должен быть сложен вместе.

В Python вы можете использовать что-то вроде этого:* Но я не могу найти, как перебирать каждую цифру числа в Java.Как вы можете сказать, я новичок в этом и не могу найти ответ в документации по Java.

Ответы [ 4 ]

23 голосов
/ 16 февраля 2011

Вы можете использовать операцию по модулю 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;
}

Вы также можете поместить его в строку, превратить его в массив символов и выполнить итерацию, выполнив что-то вроде Math.pow(charArray[i] - '0', 2.0);

5 голосов
/ 16 февраля 2011

Предполагая, что число является целым числом для начала:

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);
}
2 голосов
/ 18 апреля 2017

Мне было интересно, какой метод быстрее всего разделить положительное число на его цифры в 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 на 64-битной Ubuntu, работающей в Eclipse Neon)

Так что, на самом деле, ничего особенного, но я был немного удивлен, что String был быстрее

0 голосов
/ 26 сентября 2018

В приведенном выше примере мы можем использовать:

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

вместо

int digit = Integer.parseInt(strNum.charAt(i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...