[英]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.