2014-06-27 2 views
-3

Когда я запускаю этот код:Запуск ошибки Ява затмение

package jmv; 

public class euler3 { 
    static int x=1; 
    static long z = 600851475143L; 
    public static void main(String[] args) { 

     System.out.println(isPrime(123454321)); 
    } 

    public static boolean isPrime(int p){ 
     for(int y=1 ; y<x ;){ 
      if(x%y == 0){ 
       return true; 
      }else{ 
       return false; 
      }   
     } 
     return false; 
    } 
} 

Он всегда возвращает ложь. Зачем? Благодарим вас за помощь. Я очень appereciate каждый ответ, который я даю, но я лучше других.

+0

Прочитайте некоторые основные уроки в java или прочитайте хорошую книгу в java, например Head First Java, которая обязательно поможет вам ... –

ответ

0

Факт вас НЕ проверяют p, параметр, заданный функции isPrime().

Это должно быть так:

package jmv; 

public class euler3 { 
    static int x=1; 
    static long z = 600851475143L; 
    public static void main(String[] args) { 
     System.out.println(isPrime(123454321)); 
    } 

    public static boolean isPrime(int p){ 
     if (p%2 == 0) { 
      return false; 
     } else { 
      for(int y=3 ; y<p ; y=y+2){ 
       if(p%y == 0){ 
        return false; 
       }   
      } 
     } 
     return true; 
    } 
} 

Вы должны проверить, если 2 делит р первый, потому что четное число может быть передан в функцию. Тогда вам просто нужно проверить нечетное число> = 3. Но это основная математика, и я уверен, что вы просто забыли ее.

Выполняя это, вы сохраняете множество тестов. Если вы проверите с y ++, вы будете проверять каждый четный номер, и это необязательно, поскольку если число четное и больше 2, оно не является простым.

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

+0

На самом деле, вы можете оптимизировать еще больше, проверяя только до (p/2), потому что есть хорошо известная теорема о том, что если y является простым и p делит целое число p, то y <= (p/2). Как математик, меня больше волнуют эти вещи, чем обычные люди. – ederpsampaio

2
for(int y=1 ; y<x ;){<-- loop never gets executed as 1<1 will be always false 

Более того, вы не увеличивающиеся y изменить его на for(int y=1 ; y<x ;y++) и присвоить определенное значение для x сказать x=10 должен быть >y.

И да, поскольку вы передаете параметр p в качестве параметра, вы должны захотеть сделать for(int y=1 ; y<p ;y++) или что-то еще. (УказаноDjon).

Кроме того, если вы пытаетесь найти число, простое или нет, вы должны идти по другой логике, поскольку ваша логика неверна.

+0

А как насчет 'p' никогда не используется? – Djon

+0

@ Djon Спасибо Хороший улов. –

+2

Это единственный ответ, который указал все проблемы, +1. – Djon

1

Потому что ваша петля никогда не выполняется. y=1 никогда не ниже, чем x=1.

+0

Это не единственная причина, по которой этот код не работает должным образом, вы должны также решить другие проблемы. (И правильно «lower thAn»). – Djon

1

Для цикла не выполняется никогда, потому что 1<1 всегда false, поэтому он будет возвращать false

вы можете определить, простое число так просто, как это:

public static boolean isPrime(int p){ 
     for(int y = 2 ; y < p ; y++){ 
      if(p % y == 0){ 
       return false; 
      } 
     } 
     return true; 
    } 
Смежные вопросы