2013-07-31 12 views
5

Potrzebuję metody zwracania liczb pierwszych w tablicy.zwraca tablicę liczb pierwszych

Więc jeśli dana: primeArray (5)

niż tablicą tak jak powinno być zwrócone (2, 3, 5)

Z jakiegoś powodu to nie wydają się działać dla mnie:

public static int[] primeArray(int numFind) 
{ 
    //determines the size of the array returned 
    int primeTotal = 0; 

    //loop to find total prime numbers 
    for (int j = 1; j <= numFind; j ++) 
    { 
     if (isPrime(j)) 
     primeTotal +=1; 
    } 

    //declare array to be returned 
    int[] numA = new int[primeTotal]; 

    //current index of prime number 
    int iP = 0; 

    //loop to add prime elements to array 
    for (int x = 1; x <= numFind; x ++) 
    { 
     if (isPrime(x)) 
     { 
      numA[iP]=x; 
      iP++; // <--- THIS IS CAUSING ME PROBLEMS 
     } 

    } 

    return numA; 
} 

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

to co używam do testowania mojego kodu:

int[] num = primeArray(11); 

    System.out.println(num[0]); 
    System.out.println(num[1]); 

Ale na wyjściu dostaję to:

1 
2 

Jeśli jednak skomentuję iP + +; niż instrukcja if ostatecznie decyduje się wykonać TYLKO, gdy liczby pierwsze są przekazywane jako parametr w: isPrime (j), ale wtedy, jeśli pokona cały cel metody primeArray, ponieważ potrzebuję metody primeArray do zwrócenia tablicy liczb pierwszych.

+0

Twój kod wygląda dobrze .. Wystarczy pętla tablica .. – Shashi

Odpowiedz

0

Wystarczy zrobić wyjście na pierwszy macierzach wartości ...

prostu zastąpić wyjście

for(int i = 0; i < num.length; i++) 
{ 
    System.out.println(num[i]); 
} 

Twój kod działa poprawnie.

0

W swojej metodzie isPrime(), dodaj jedno oświadczenie na koniec

if(n < 2) return false;

Myślę, że w obecnej drodze, gdy 1 jest przekazywana dostaniesz prawdziwe.

Inną propozycją, o której mogę myśleć jest to, że możesz użyć statycznego stołu dla pewnej liczby liczb, jeśli spodziewasz się, że twój limit będzie mały.

static int[] PRIME_TABLE = {2,3,5,7,11,13,17,19,23,29,31}; itp

Więc gdy limit jest mniejszy niż 32 w tym przykładzie nie trzeba obliczyć wszystkie liczby pierwsze poniżej niego i tylko pętli tej tablicy i zwraca liczb.

10

Twoja metoda isPrime() jest wadliwa. Musisz zwrócić false, dla number < 2. Ponadto nie trzeba wykonywać iteracji aż do n, tylko iterować do n/2 lub jeszcze lepiej sqrt(n).

go zmienić na:

public static boolean isPrime(int n) { 

    if (n < 2) return false; 

    int maxIteration = Math.ceil(Math.sqrt(n)); 

    for (int i = 2; i < maxIteration; i++) { 
     if(n % i == 0) 
      return false; 
    } 

    return true; 
} 

Teraz, biorąc pod uwagę twój prawdziwy problem (Należy pamiętać, że metoda jest po prostu w porządku.To powrót poprawny wynik, biorąc pod uwagę zmieniono metodę isPrime()), ale można uniknąć iteracji dwukrotnie stosując ArrayList zamiast tablicę:

List<Integer> primes = new ArrayList<Integer>(); 

//loop to find total prime numbers 
for (int j = 1; j <= numFind; j ++) 
{ 
    if (isPrime(j)) 
     primes.add(j); 
} 

a następnie można po prostu wrócić liczb pierwszych, i zmień metodę zwracania metody na List<Integer> zamiast na int[].

public static List<Integer> primeNumberList(int numFind) 

Jeśli naprawdę chcemy zwrócić int[], to trzeba popracować nawracanie ArrayList do int tablicy. Zostawiam to zadanie Tobie. Po prostu szukaj tego tylko na SO, dostaniesz za dużo postów.


Ponadto, jeśli masz zamiar wygenerować wszystkie liczby pierwsze do bardzo dużej liczby, to należy spojrzeć na Sieve of Eratosthenes

+0

również Pamiętam istnieje sposób, aby powiedzieć wcześniej, ile liczb pierwszych nie będzie być. – Breavyn

+0

+1, ale zauważ, że 'Math.ceil (Math.sqrt (n))' lepiej jest być poza pętlą, nie obliczać go co krok – Tala

+0

@Tala. Tak, poprawi kod. dzięki :) –

0

Próbowałem napisać isPrime (int num) funkcję w nieco inny droga. Kod staje się nieco dłuższy niż , ale działa. Użyłem innej logiki, aby określić, czy liczba wynosi 1, ponieważ 1 nie jest ani pierwsza, ani złożona. Kod znajduje się poniżej.

static int count=0; 
    static boolean flag; 
public static boolean isPrime(int num){ 

    for(int i = 1; i<=num/2 ; i++){ 

     if(num%i ==0){ 

      count++; 

      if(count >=2){ 

       flag = false;  
      } 
      else{ 
        if(num/1==1){ 
         flag = false; 
        } 
        else{ 
         flag = true; 
        } 

      } 

     } 
    } 
     return flag; 
    } 
0

ten powrót Kod wszystkie liczby pierwsze mniejsze niż n

public ArrayList<Integer> allPrimesLessThanN(int n) { 

    int sqrtN = (int)Math.sqrt(n); 
    int [] numberList = new int[n]; 
    ArrayList<Integer> primeList = new ArrayList<>(); 

    for(int i = 0; i < n ; i++) 
    { 
     numberList[i] = i+1; 
    } 

    int k = 2; 
    while(k <= sqrtN) 
    { 
     if(numberList[k+1] != 0) 
     { 
      for(int j = k+1; j < n; j++) 
      { 
       if(numberList[j] % k == 0) 
       { 
        numberList[j] = 0; 
       } 
      } 
     } 

     k++; 
    } 

    for(int i = 1; i < n; i++) 
    { 
     if(numberList[i] != 0) 
      primeList.add(numberList[i]); 
    } 

    return primeList; 

} 
Powiązane problemy