2016-03-05 3 views
0

Я хочу суммировать все простые числа, которые имеют значение меньше 10.Java Prime эффективность искателя

Это мой код:

boolean kontroll = true; 
    long limit = 10; 
    long checker = 2; 
    long sum = 0; 

    while (checker < 10) { 
     for (long i = 3; i < Math.sqrt(checker); i += 2) { 
      if (checker % 2 == 0) { 
       kontroll = false; 
       break; 
      } else { 
       if (checker % i == 0) { 
        kontroll = false; 
       } 
      } 
     } if (kontroll) { 
      sum += checker; 
      System.out.println("Prim: " + checker); 
     } 
     checker++; 
     kontroll = true; 
    } 
    System.out.println(sum); 

я получаю этот выход:

Prim: 2 
Prim: 3 
Prim: 4 
Prim: 5 
Prim: 6 
Prim: 7 
Prim: 8 
Prim: 9 
44 

Что не так с этой сборкой? Если я удалю Math.sqrt(checker);, программа работает, но работает медленно. Разве я не могу взять квадратный корень шашки?

+0

Присвоить ** поплавка Q = Math.sqrt (Накладной); ** перед оператором в то время, то есть ** для (долго я = 2; я <д, I + = 2) ** вместо этого. Это должно ускорить ваш код. –

+0

@ArifBurhan Почему вы используете 'float'? – MikeCAT

+0

@Aminorph: Ваша программа неправильно идентифицирует простые числа и, следовательно, сумма также неверна. Я думаю, что это отчасти потому, что вы установили «kontroll = true» в конце цикла while и в следующей итерации, если цикл for не выполняется даже один раз, то следующий номер всегда будет использоваться для вычисления суммы – greenPadawan

ответ

1

3 больше Math.sqrt(checker), когда checker - это отрицательное число и составляет 8 или менее.

Попробуйте это:

boolean kontroll = true; 
long limit = 10; 
long checker = 2; 
long sum = 0; 

while (checker < 10) { 
    if (checker != 2 && checker % 2 == 0) { // move this check out of the loop and correct condition 
     kontroll = false; 
    } else { 
     long max = (long)Math.sqrt(checker); 
     for (long i = 3; i <= max; i += 2) { // change < to <= 
      if (checker % i == 0) { 
       kontroll = false; 
       break; // add break for better performance 
      } 
     } 
    } 
    if (kontroll) { 
     sum += checker; 
     System.out.println("Prim: " + checker); 
    } 
    checker++; 
    kontroll = true; 
} 
System.out.println(sum); 
+0

Вы можете улучшить 'if (checker ...' читать 'if (checker% 2 == 0) {kontroll = checker == 2;} else {...}' –

0

Ваша переменная kontroll присваивается true, и вы зацикливание от 3 к sqrt(checker), что в вашем случае checker будет ниже 10.

Таким образом, ваш код будет ввести свой цикл только один раз, когда checker = 10 (3 < sqrt(10)) и другие времена, они просто пройти до

if (kontroll) { //remember, your kontroll assigned to true =) 
    sum += checker; 
    System.out.println("Prim: " + checker); 
} 

и сумма всегда будет добавлен. Ура!

0

Оптимизированная версия, которая печатает простые числа до некоторого числа.

final List<Integer> primes = new ArrayList<>(Collections.singletonList(2)); 

/** 
* Print prime numbers up to {@code n} inclusive 
*/ 
public void findPrimes(int n) { 
    // check only odd numbers 
    for (int i = 3; i <= n; i += 2) { 
     isPrime(i); 
    } 
    System.out.println(primes); 
} 

// a function which does have side effects (adds to the primes collection) 
private boolean isPrime(final int i) { 
    // we really need to check for divisors only up to sqrt 
    int sqrt = (int)Math.sqrt(i); 
    // and we really need to find only prime divisors since any 
    // number can be written as a product of prime numbers 
    for (int prime : primes) { 
     if (i % prime == 0) { 
      return false; 
     } 
     if (prime > sqrt) { 
      break; 
     } 
    } 
    primes.add(i); 
    return true; 
} 
+0

Приятно! Спасибо за это! –

Смежные вопросы