2013-07-31 47 views
5

Tôi cần phương thức trả về số nguyên tố trong một mảng.trả về một dãy số nguyên tố

Vì vậy, nếu đưa ra: primeArray (5)

hơn một mảng như vậy nên được trả lại: (2, 3, 5)

Đối với một số lý do này dường như không làm việc cho tôi:

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; 
} 

Đây là những gì tôi đang sử dụng để kiểm tra mã của tôi:

int[] num = primeArray(11); 

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

Nhưng đối với đầu ra tôi nhận được điều này:

1 
2 

Nếu tuy nhiên tôi nhận xét iP ++; so với câu lệnh if cuối cùng quyết định thực thi CHỈ khi các số nguyên được chuyển thành tham số trong: isPrime (j) nhưng sau đó nếu đánh bại toàn bộ mục đích của phương thức primArray vì tôi cần phương thức primArray để trả về một mảng các số nguyên tố.

+0

Mã của bạn có vẻ tốt đẹp .. Chỉ cần lặp mảng .. – Shashi

Trả lời

0

Bạn chỉ cần làm đầu ra cho người đầu tiên Mảng-Values ​​...

chỉ cần thay thế đầu ra của bạn

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

Mã của bạn hoạt động tốt.

0

Trong phương pháp isPrime() của bạn, thêm một tuyên bố này vào cuối

if(n < 2) return false;

Tôi nghĩ theo cách hiện nay, khi 1 được thông qua bạn nhận được một sự thật.

Một đề xuất khác mà tôi có thể nghĩ đến là bạn có thể sử dụng bảng tĩnh cho một số lượng số nếu bạn mong đợi giới hạn của mình nhỏ.

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

Vì vậy, khi giới hạn nhỏ hơn 32 trong ví dụ này, bạn không cần phải tính toán tất cả các số nguyên tố dưới nó và chỉ cần lặp qua bảng này và trả lại số.

10

Phương thức isPrime() của bạn bị lỗi. Bạn cần phải trả lại false, cho number < 2. Ngoài ra, bạn không cần phải lặp lại đến n, chỉ cần lặp lại cho đến n/2 hoặc thậm chí tốt hơn sqrt(n).

Thay đổi nó để:

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; 
} 

Bây giờ, được đưa ra vấn đề thực sự của bạn (Lưu ý rằng phương pháp của bạn là tốt.Nó sẽ trả lại cho bạn kết quả chính xác, do bạn đã thay đổi phương pháp isPrime() của bạn), nhưng bạn có thể tránh lặp hai lần bằng cách sử dụng một ArrayList thay vì mảng:

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); 
} 

Và sau đó bạn chỉ có thể trở lại số nguyên tố, và thay đổi kiểu trả về của phương thức thành List<Integer> thay vì int[].

public static List<Integer> primeNumberList(int numFind) 

Nếu bạn thực sự muốn trở lại một int[], thì bạn cần phải làm một số công việc chuyển đổi các ArrayList để một mảng int. Tôi để lại nhiệm vụ này cho bạn. Chỉ cần tìm kiếm điều này trên SO, bạn sẽ nhận được quá nhiều bài đăng.


Ngoài ra, nếu bạn đang đi để tạo ra tất cả các số nguyên tố cho đến khi một số lượng rất lớn, sau đó bạn nên có một cái nhìn tại Sieve of Eratosthenes

+0

cũng Tôi nhớ có một cách để nói trước có bao nhiêu số nguyên tố có sẽ được. – Breavyn

+0

+1, nhưng lưu ý rằng 'Math.ceil (Math.sqrt (n))' là tốt hơn để được bên ngoài vòng lặp, không phải để tính toán nó mỗi bước – Tala

+0

@Tala. Đúng vậy, sẽ chỉnh sửa mã. cảm ơn :) –

0

Tôi cố gắng để viết isPrime (int num) chức năng trong một chút khác nhau đường. Mã sẽ trở nên dài hơn một chút nhưng hoạt động. Tôi đã sử dụng một logic khác để xác định xem số có là 1 hay không, bởi vì 1 không phải là số nguyên tố cũng không phải là tổng hợp. Mã dưới đây.

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

mã trở lại này tất cả các số nguyên tố nhỏ hơn 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; 

} 
Các vấn đề liên quan