簡體   English   中英

將素數打印為N值

[英]Printing Prime Numbers to N value

該程序應該將所有素數打印到您輸入的int,例如:

 Enter a Number: 
 20
 2
 3
 5
 7
 11
 13
 17
 19

我只是無法使我的程序正常工作,我真的不知道該怎么做,因此,如果有人可以對其進行檢查並嘗試對其進行修復,將不勝感激,謝謝。

import java.util.Scanner;
 public class PrimeGenerator {
public static void main(String args[]) {
    Scanner k = new Scanner(System.in);
    System.out.println("Enter an integer");
    int number = k.nextInt();
    PrimeGenerator matt = new PrimeGenerator();
    System.out.println(matt.nextPrime(number));
}

private int number;

public PrimeGenerator(int n) {
 number = n;
}

public int nextPrime(int number) {
    for (int i = 1; i <= number; i++) {
        boolean prime = true;
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                prime = false;
            }
        }
        if (prime){
            return i;
        }
    }
   }
 }

您實際上已經在那里。 您剛剛在程序流程中犯了一個錯誤。

for (int i = 1; i <= number; i++) {
    boolean prime = true;
    for (int j = 2; j < i; j++) {
        if (i % j == 0) {
            prime = false;
        }
    }
    if (prime){
        return i; //<-- this return will terminate nextPrim
    }
}

修復/改進的事情:

  • nextPrim將需要在每個可能的程序分支內返回一個值。 這意味着:考慮以下情況: nextPrim在給定范圍內找不到任何數字並退出循環。 現在程序將被卡住而沒有任何返回值。
  • 無需返回找到的第一個素數,您可以打印找到的素數並保持生成器運行。 不錯,很容易,並且通過返回任何內容解決了麻煩,因為您現在可以簡單地將nextPrim聲明為void 我建議將其重命名為printPrims或類似的名稱,以使更改明確。
  • 傳遞number :您只需將number傳遞一次到prim-generator,就可以節省一些精力。 最簡單的解決方案是將其傳遞給nextPrim / printPrims 現在,您可以刪除實例變量number和構造函數,這可以解決構造函數簽名的問題。
  • 1不是要學究的素數。 因此,讓我們學究一點,並在printPrims使用2開始外部循環,以便將2作為第一個被檢查為素數的數字。

因此,將其放入代碼中:

import java.util.Scanner;

public class PrimeGenerator {
    public static void main(String args[]) {
        Scanner k = new Scanner(System.in);
        System.out.println("Enter an integer");
        int number = k.nextInt();
        PrimeGenerator matt = new PrimeGenerator();
        matt.printPrims(number);
    }

    public void printPrime(int number) {
        for (int i = 2; i <= number; i++) {
            boolean prime = true;
            for (int j = 2; j < i; j++) {
                 if (i % j == 0) {
                     prime = false;
            }
        }
        if (prime){
            System.out.println(i);
        }
    }
}

一些一般提示:

  • 解決編譯器錯誤。 它們准確地告訴您代碼中的錯誤發生位置和錯誤。
  • 在實施程序之前,請考慮一下程序的流程。
  • 將任務分解為較小的任務,然后逐個實施。 例如:對於此問題,請首先打印出2, number范圍內的所有數字。 然后,進一步進行操作,並添加功能以過濾素數。 現在,您擁有兩個可以輕松獨立進行測試的組件。

nextPrimes在那里了,但是當您返回inextPrimes函數將過早終止,請嘗試如下操作:

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner k = new Scanner(System.in);
    System.out.print("Enter an integer:");
    int number = k.nextInt();
    printPrimesUptoN(number);
  }

  public static void printPrimesUptoN(int n){
    for(int i=2;i<n;i++){
      boolean isPrime = true;
      for(int j=2;j<i;j++){
        if(i % j == 0){
          isPrime = false;
          break;
        }
      }
      if(isPrime)
        System.out.println(i);
    }
  }
}

在這里嘗試

您的代碼存在一些問題,也許我們可以將其修復在一起。 首先,您在nextPrime缺少return語句,並且沒有空的默認構造函數PrimeGenerator()因為您創建了一個單參數構造函數。 嘗試這個:

public class PrimeGenerator {
    public static void main(String args[]) {
        Scanner k = new Scanner(System.in);
        System.out.println("Enter an integer");
        int number = k.nextInt();
        // you probably want to pass your maximum value to the constructor
        PrimeGenerator matt = new PrimeGenerator(number);
        // without a loop of some sort this will only print a single prime number, e.g.
        // Enter a Number:
        // 20
        // 2
        System.out.println(matt.nextPrime(number));
    }

    private int number;

    public PrimeGenerator(int n) {
        this.number = n;
    }

    // you're using the argument as upper boundary for your prime detection while not increasing your lower boundary
    // also you're checking if i is a prime here which you always start at 1. this should always return the same value because once you find a prime number you return
    // you should consider using an algorithm like Sieve of Eratosthenes (or advanced verions thereof) to determine if a given number is prime
    public int nextPrime(int number) {
        for (int i = 1; i <= number; i++) {
            boolean prime = true;

            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    prime = false;
                }
            }

            if (prime){
                return i;
            }
        }

        // you need to return something at the end of this method or throw an exception
        throw new IllegalStateException("no more prime numbers available!");
    }
}

這不是可以產生您期望的結果的解決方案,但至少可以編譯。 從那時起,您可以繼續進行並解決算法問題。

您原來的錯誤是在。

PrimeGenerator matt = new PrimeGenerator();

錯誤:

PrimeGenerator.java:7: error: constructor PrimeGenerator in class PrimeGenerator cannot be applied to given types;
    PrimeGenerator matt = new PrimeGenerator();
                          ^
  required: int
  found: no arguments
  reason: actual and formal argument lists differ in length
1 error

注意,您有一個與您的類同名的方法,但是我不認為您將其用作構造函數,如果您使用的是一個int卻沒有給出它。 您在第13行的方法是:

public PrimeGenerator(int n) {
 number = n;
}

嘗試做

new PrimeGenerator().nextPrime(number);

代替

import java.util.Scanner;

public class PrimeGenerator {
        public static void main(String args[]) {
                Scanner k = new Scanner(System.in);
                System.out.println("Enter an integer");
                int number = k.nextInt();
                new PrimeGenerator().nextPrime(number);
        }   

        public void nextPrime(int number) {
                for (int i = 1; i <= number; i++) {
                        boolean prime = true;
                        for (int j = 2; j < i; j++) {
                                if (i % j == 0) {
                                        prime = false;
                                }   
                        }   
                        if (prime){
                                System.out.println(i);
                        }   
                }   
        }   
}

(可選)要使用原始構造函數,可以將其分開。

import java.util.Scanner;

public class PrimeGenerator {

        private int number; 

        public static void main(String args[]) {
                Scanner k = new Scanner(System.in);
                System.out.println("Enter an integer");
                int number = k.nextInt();
                // Initialize with a number.
                PrimeGenerator pg = new PrimeGenerator(number);
                pg.printPrimes();
        }   

        // This is the constructer you were misusing.
        public PrimeGenerator(int n) {
                number = n;
        }   

        public void printPrimes() {
                // Actually use your private number variable.
                for (int i = 1; i <= number; i++) {
                        boolean prime = true;
                        for (int j = 2; j < i; j++) {
                                if (i % j == 0) {
                                        prime = false;
                                }   
                        }   
                        if (prime){
                                System.out.println(i);
                        }   
                }   
        }   
}

有幾個問題:

  1. 您正在使用IDE嗎? 如果是這樣,那是什么,否則為什么呢? 如果您認為自己是初學者,建議使用Eclipse IDE或NetBeans IDE等。
  2. 關於您的算法,乍一看,這里有一個編譯和一個邏輯問題。
  3. 編譯問題是當您的類的執行不起作用時。 在這種情況下,方法nextPrime(int number)必須返回一個int 盡管放置了return子句,但當prime為false時,該方法不返回任何值。 您可以使用IDE輕松發現此問題。
  4. 另一個編譯問題,前哨或變量i在for循環內,而您正在將其值打印在它的外面。 再次,IDE將幫助您解決此問題。
  5. 邏輯問題是,當且僅當標志prime為true時,您才返回一個值,因此,在調用方法(假設正在工作)時,僅在調用System.out.println(matt.nextPrime(number));時獲得一個值System.out.println(matt.nextPrime(number));

正確的實現應考慮以下因素:

  1. 該方法不會返回,即public void nextPrime(number) { ... ,這意味着您不需要在main方法中進行打印,只需調用它即可。
  2. 該方法實際上會打印數字。
  3. 通過這種方式,您可以檢查i % j是否等於零,然后就不需要處理更多的除法器了,從而打破了for循環。
  4. 打印它。
  5. 而已。

     public static void main(String [] args) { . . . PrimeGenerator matt = new PrimeGenerator(); matt.nextPrime(number); } public void printPrime(int number) { boolean prime = true; for (int i = 2; i <= number; i++) { prime = true; for (int j = 2; j < i; j++) { if (i % j != 0) { prime = false; break; } } if (prime) { System.out.println(i); } } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM