[英]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
和構造函數,這可以解決構造函數簽名的問題。 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
在那里了,但是當您返回i
, nextPrimes
函數將過早終止,請嘗試如下操作:
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);
}
}
}
}
有幾個問題:
nextPrime(int number)
必須返回一個int
。 盡管放置了return子句,但當prime為false
時,該方法不返回任何值。 您可以使用IDE輕松發現此問題。 i
在for循環內,而您正在將其值打印在它的外面。 再次,IDE將幫助您解決此問題。 prime
為true時,您才返回一個值,因此,在調用方法(假設正在工作)時,僅在調用System.out.println(matt.nextPrime(number));
時獲得一個值System.out.println(matt.nextPrime(number));
正確的實現應考慮以下因素:
public void nextPrime(number) { ...
,這意味着您不需要在main方法中進行打印,只需調用它即可。 i % j
是否等於零,然后就不需要處理更多的除法器了,從而打破了for
循環。 而已。
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.