В чем ошибка в моей программе с самыми большими простыми числами?

#java #primes

#java #простые числа

Вопрос:

 public class LargestPrimeFactor {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int cases = scan.nextInt();
    int num = 0, temp = 0;
        while(cases!=0) {
        num = scan.nextInt();
        for(int i=2; i<=num; i  )
            if(num%i==0) {
                if(isPrime(i)) {
                    if(temp<i)
                        temp = i; //to always have the largest factor
                }
                num/=i; // to reduce the iterations for a large number.
            }
        System.out.println(temp);
        cases--;
    }
}

public static boolean isPrime(int num) {
    if ( num > 2 amp;amp; num%2 == 0 )
        return false;
    int top = (int)Math.sqrt(num)   1;
    for(int i = 3; i < top; i =2)
        if(num % i == 0)
            return false;
    return true; 
}
}
  

Этот код вычисляет наибольший простой множитель числа.
Это выдает ошибку 5/6 раз от онлайн-судьи. Я не могу определить исключение или ошибку.
Пожалуйста, помогите…

Комментарии:

1. Вы смотрели на результат, который он дает?

2. Вы смотрели на ввод?

3. @Carcigenicate он не показывает входные и выходные данные. просто затраченное время

4. @PeterLawrey он не показывает входные и выходные данные. просто затраченное время

5. @Shadow_Sphynx Вот почему вы вставляете операторы печати или используете отладчик. Вам нужно научиться диагностировать программу, глядя на то, что происходит с некоторыми из них, которые они запускают.

Ответ №1:

Вы должны сбросить temp на 0 для каждого случая. Пример ввода:

 2 7 4
  

Ожидаемый результат:

 7
2
  

Фактический результат

 7
7
  

Надеюсь, это поможет.

Такие ошибки легче допускать, когда вы объявляете свои переменные раньше, чем они вам нужны. Вместо

 int num = 0, temp = 0;
    while(cases!=0) {
    num = scan.nextInt();
  

попробуйте

 while (cases != 0) {
    int num = scan.nextInt();
    int temp = 0;
  

Комментарии:

1. Я думаю, что это была проблема. Спасибо… Но есть две вещи, которые я хочу спросить: 1.) Я все еще получаю ошибку времени выполнения в последнем случае. Есть идеи, почему? 2.) Если я объявлю переменную внутри цикла, не займет ли моя программа больше места?

2. 1) Нет, не совсем, извините. Вы имеете в виду последнее дело, которое запускает онлайн-судья? 2) Определенно нет. Компилятор достаточно умен, чтобы использовать пространство одинаково в обоих случаях, и даже если бы это было не так, он все равно не занял бы больше . И не то, чтобы вам стоило беспокоиться, если бы это произошло; пространство такое дешевое.

3. Существуют ли какие-либо требования к тому, что ваша программа должна делать в случае незаконного ввода? Если это так, и если бы я писал онлайн-судью, я бы обязательно попробовал. Может ли это быть объяснением ошибки во время выполнения? (Только что попробовал -1 случай, ваша программа выполняется в бесконечном цикле.)

4. да, случай, когда работает онлайн-судья. и я попытался изменить типы данных с int на long, если судья давал большое значение, но затем я был прекращен из-за тайм-аута . Это все еще не принято.

5. Похоже, вы на правильном пути. Однако я не понял, что происходит.