#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. Похоже, вы на правильном пути. Однако я не понял, что происходит.