Итерация по каждой цифре в числе

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

В Python вы можете использовать что-то вроде этого:

SQUARE[d] for d in str(n)

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


person Isaac Lewis    schedule 15.02.2011    source источник
comment
Если вы закончили с вопросом, пожалуйста, примите ответ.   -  person Argote    schedule 16.02.2011


Ответы (5)


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

person Argote    schedule 15.02.2011
comment
@Isaac Lewis: добавлен некоторый (непроверенный) код, который, я думаю, может помочь вам получить результат сложения квадратов каждой цифры. - person Argote; 16.02.2011
comment
Вам нужно исправить «число / 10», чтобы назначить его куда-нибудь. - person Darron; 16.02.2011
comment
Ах, пожалуйста, не используйте Math.pow для возведения числа в квадрат. result += ((number%10) * (number % 10)) было бы лучше (или используйте дополнительную переменную, чтобы избавиться от двойного %). И ваш number / 10 должен быть number /= 10, я думаю. - person Paŭlo Ebermann; 16.02.2011
comment
Хорошие наблюдения Даррон и Пауло. - person Argote; 16.02.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);
}
person yavoh    schedule 15.02.2011

Мне было интересно, какой метод будет самым быстрым, чтобы разбить положительное число на его цифры в Java, String или по модулю.

  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
  }

vs

  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 был быстрее

person Spangen    schedule 18.04.2017

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

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

вместо

int digit = Integer.parseInt(strNum.charAt(i));
person D.Charan    schedule 26.09.2018
comment
Из отзыва: Какой пример? Не могли бы вы отредактировать свой вопрос и быть более точным? Порядок ответов может измениться в SO в зависимости от их голосов. - person sɐunıɔןɐqɐp; 26.09.2018

Этот код возвращает первое число (после 1), которое соответствует вашему описанию.

public static void main(String[] args) {
    int i=2;
    // starting the search at 2, since 1 is also a happy number
    while(true) {
        int sum=0;
        for(char ch:(i+"").toCharArray()) { // casting to string and looping through the characters.
            int j=Character.getNumericValue(ch);
            // getting the numeric value of the current char.
            sum+=Math.pow(j, j);
            // adding the current digit raised to the power of itself to the sum.
        }
        if(sum==i) {
            // if the sum is equal to the initial number
            // we have found a number that fits and exit.
            System.out.println("found: "+i);
            break;
        }
        // otherwise we keep on searching
        i++;
    }
}
person StylexTV    schedule 26.05.2020
comment
Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщение и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. Из обзора - person double-beep; 26.05.2020
comment
извините, но это мой первый ответ - person StylexTV; 29.05.2020