2016-01-24 3 views
2

Я написал две программы для моей лабораторной работы для поиска простых чисел формы k^2 +1 менее 1000000 двумя разными способами, чтобы иметь лучшую временную сложность во второй программе, но я получаю разные ответы в обоих случаях. Может кто-нибудь сказать мне, почему? Сначала мы сначала проверяем, является ли его простым (n), а затем проверяет, является ли его идеальный квадрат (n-1). Во втором мы непосредственно проверяем форму k^2 + 1 для k меньше, чем sqrt (1000000) -1 и увеличиваем счет. Но оба дают разные ответы. Какой метод подходит для подсчета простых чисел формы k^2 + 1 до 1000000?Java-Почему эти два дают разные выходы для вычисления простых чисел вида k^2 + 1?

Первая программа

public class KSqPlus1 
    { 

    public static void main(String [] args) 
    { 
    int k = 2; 
    for (int n = 11; n < 1000000; n += 2) 
     if (isPrime (n)) 
     if (isPerfectSquare (n - 1)) 
     { k ++; 

     } 

    System.out.println (k); 

    } 

    public static boolean isPrime(int n) 
    { 
    for(int divisor=3;divisor*divisor<=n;divisor+=2) 
     if(n%divisor==0) 
      return false; 
     return true; 
    } 
    public static boolean isPerfectSquare (int n) 
    { 
      for(int divisor=2;divisor*divisor<=n;divisor+=2) 
     if(divisor * divisor < n) continue; 
      else if (divisor * divisor == n) return true; 
      return false; 

    } 
} 

вторая программа

import java.lang.Math; 
public class PrimeArrays1 
{ 

    public static void main(String [] args) 
    { 

    int count=2;int k; 
    for(k=3;k<(Math.sqrt(1000000)-1);k++) 
    { int x=k*k+1; 
    if(isPrime(x)) 
    { 
     count++; 

    } 
    } 
    System.out.println(count); 



    } 

    public static boolean isPrime(double n) 
    { 
    for(int divisor=3;divisor*divisor<=n;divisor+=2) 
    if(n%divisor==0) 
    return false; 
    return true; 
    } 

} 

EDIT :: Ниже правильный IsPrime function..now программы дают одинаковый ответ :)

public static boolean isPrime(int n) 
    { 
    for(int divisor=2;divisor*divisor<=n;divisor+=1) 
     if(n%divisor==0) 
      return false; 
     return true; 
    } 
+0

Ну, одно отличие - 'd', который вы печатаете в обоих случаях, - это не то же самое - подумайте - в одном случае это простое число, а в другом - это число, в квадрате и добавленное 1. У вас есть тот же счет в обоих? – Eran

+0

d предназначен только для отладки цели. Я просто забыл удалить его. Кроме того, это не имеет значения. удалил его сейчас – cain

+0

Итак, каковы результаты, которые вы получаете? –

ответ

2

Этот метод

public static boolean isPerfectSquare (int n) 
    { 
      for(int divisor=2;divisor*divisor<=n;divisor+=2) 
     if(divisor * divisor < n) continue; 
      else if (divisor * divisor == n) return true; 
      return false; 

    } 

вернет true только в том случае, если n является квадратом четного числа. Я думаю, вы хотите проверить, является ли это квадратом любого числа.

Аналогично, метод

public static boolean isPrime(double n) 
    { 
    for(int divisor=3;divisor*divisor<=n;divisor+=2) 
    if(n%divisor==0) 
    return false; 
    return true; 
    } 

Не проверяет факторы 2, так что 4, 8, ... вернуться true.

+0

OP проверяет нечетные числа на простое, поэтому isPrime в порядке, но isPerfectSquare имеет недостатки. Так как он не пропускает потенциальное правое, но одно меньше, что всегда является четным числом. –

+0

@JensSchauder counter пример: k = 3, x = 10 передается isPrime в программе 2. – Henry

+0

Я думаю, что обе функции правы. я хочу найти, является ли число, которое является как (простое, так и форма k^2 + 1 для любого k), например 17 (при k = 4) - это простое и 17-1 = 16 - идеальный квадрат.so yes isPerfectSquare всегда будет иметь тип числа 1-го типа, т. е. четный, а для isPrime Функция - четные числа не являются первыми, кроме 2 – cain