Счастливое число с пользовательским вводом

У меня возникают проблемы с решением следующего вопроса: я полагаю, что пользователь должен ввести число и проверить, является ли это счастливым числом. Счастливое число — это сумма квадратов четной цифры (начиная со второй позиции), кратной 7.

Ниже приведен пример моих кодов, когда я запускаю программу, она зависает при вводе данных пользователем, пожалуйста, сообщите, как мне заставить ее работать:

public class Tester {

public static void main(String[] args) {
            
    Scanner scanner = new Scanner(System.in);

    System.out.println("Input a number: ");
    int number = scanner.nextInt();
    
    int count = 0;
    while(number!=0) {
        number/=10;
        ++count;
    }
    
    int[] array = new int[count];
    int sum = 0;
    
    for (int i=0; i<count; i++) {
        array[i] = scanner.nextInt();
    }

    for (int i=0; i<count; i++) {
        if(array[i]%2==0) {
            sum+=(array[i]*array[i]);
        }
        else {
            continue;
        }
    }
    
    if (sum%7==0) {
        System.out.println("The number: " +number+ "is a Lucky number");
    }
    else {
        System.out.println("Oops! Not a Lucky number");
    }
    
    scanner.close();
}
}

person Wilson Soo    schedule 27.09.2020    source источник
comment
Что здесь происходит: array[i] = scanner.nextInt(); В большинстве проблем со счастливыми числами требуется одно число, но вы, похоже, запрашиваете дополнительные действия пользователя помимо этого (вероятно, непреднамеренно), поэтому ваша программа зависает.   -  person MarsAtomic    schedule 27.09.2020
comment
Какие входные данные вы передали в программу?   -  person Smile    schedule 27.09.2020
comment
Вам нужны четные цифры?   -  person Kaviarasu    schedule 27.09.2020


Ответы (3)


Я считаю, что виновником является цикл ниже:

for (int i=0; i<count; i++) {
  array[i] = scanner.nextInt();
}

Я думаю, ваше намерение состояло в том, чтобы получить каждую из цифр в массив. Однако вы получаете ввод от сканера (который в данном случае является вводом пользователя) count количество раз.

Хотя есть несколько способов получить количество цифр и каждую цифру в массиве. Я собираюсь дать вам два пути. Кроме того, я не вижу проверки входного целого числа (например, отрицательных чисел и т. д.), и я собираюсь игнорировать их прямо сейчас.

Подход 1: исправлен цикл for

Вы просто получаете i-ю цифру числа, используя формулу.

for (int i=1; i<=count; i++) {
  array[i] = (int) (number / Math.pow(10, count-i)) % 10;
}

Подход 2. Преобразование чисел в строку и обратно с помощью потоков

List<Integer> digits = Arrays.toStream(number.toString().split("")).map(
  digitChar -> Integer.parseInt(digitChar)
).collect(Collectors.toList());

Примечание. Вам необходимо импортировать классы java.util.Arrays и java.util.stream.Collectors.

person Gurusharan S    schedule 27.09.2020

Если вам нужны даже позиционированные цифры, вы можете напрямую получить их в цикле while.

while(number!=0) {
    if(count%2 !=0){
      int value = number %10;   // even positioned values
      // Do whatever you need to do with this value
    }
    number/=10;
    ++count;
}

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

int noOfDigits =(int) Math.floor(Math.log10(number)+1); // Finding No of digits
int[] array = new int[noOfDigits];

while(--noOfDigits>=0){
    array[noOfDigits] = number/10;         // storing every digits in reverse order
    number%=10;
}

Я не знаю, что приведенный ниже код будет полезен для вашей основной логики, но я тоже записываю это.

Если вам нужна сумма квадратов четных цифр в числе, представленном в виде массива, вы можете использовать приведенный ниже код.

int sum = 0;
for (int i=1; i<array.length; i+=2) {
    sum += array[i] * array[i];
}

if (sum%7==0) {
    // print number is lucky
}
else {
   // print number is not lucky
}
person Kaviarasu    schedule 27.09.2020

Если я правильно понял ваше описание, вот программа, которая делает то, что вы хотите:

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Input a number: ");
    System.out.flush();
    int number = scanner.nextInt();

    int count = 0;
    int n = number;
    int sum = 0;
    while(n!=0) {
        int d = n % 10;
        n/=10;
        ++count;
        if (count % 2 == 0) {
            System.out.printf("sum = %d + %d^2 = %d\n", sum, d, sum + d * d);
            sum += d * d;
        }
    }

    if (sum%7==0) {
        System.out.printf("The number: %d is a Lucky number (%d = 7 * %d)", number, sum, sum / 7);
    }
    else {
        System.out.println("Oops! Not a Lucky number");
    }

    scanner.close();
}

Удачный результат:

Input a number: 123456
sum = 0 + 5^2 = 25
sum = 25 + 3^2 = 34
sum = 34 + 1^2 = 35
The number: 123456 is a Lucky number (35 = 7 * 5)
person CryptoFool    schedule 27.09.2020