将质数打印为 N 值
Printing Prime Numbers to N value
这个程序应该打印你输入的所有素数,直到你输入的一个整数,例如:
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
}
}
要fix/improve的事情:
nextPrim
需要 return 每个可能的程序分支中的值。这意味着:考虑 nextPrim
在给定范围内找不到任何数字并跳出循环的情况。现在程序将在没有任何 return-value 的情况下卡住。
- 您可以打印找到的原始数并保留生成器 运行,而不是 return 找到第一个原始数。很好,很简单,解决了 returning 任何问题,因为你现在可以简单地将
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
函数在您返回时过早终止 i
,请尝试这样的操作:
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);
}
}
}
试一试here!
您的代码存在一些问题,也许我们可以一起解决。首先,您在 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
请注意,您有一个与您 class 同名的方法,但我不认为您将其用作构造函数,如果是,它采用了一个您没有提供的 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);
}
}
}
}
有几个问题:
- 您使用的是 IDE 吗?如果是这样,它是什么,否则为什么不呢?如果您认为自己是初学者,建议您使用 Eclipse IDE 或 NetBeans IDE.
- 关于你的算法,乍一看,编译和逻辑都有问题。
- 编译问题是当你的 class 执行不工作时。在这种情况下,方法
nextPrime(int number)
必须 return 一个 int
。尽管您放置了 return 子句,但当素数为 false
时,该方法不会 returning 任何值。您可以使用 IDE. 轻松发现此问题
- 另一个编译问题,标记或变量
i
是 INSIDE for 循环,而您正在打印它的值 OUTSIDE。再一次,IDE 会帮助您解决这个问题。
- 逻辑问题是,当且仅当标志
prime
为真时,您才 return 获取一个值,因此,当调用该方法(假设有效)时,您只获得一个值你打电话给 System.out.println(matt.nextPrime(number));
正确的实施应考虑以下因素:
- 该方法没有return,即
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);
}
}
}
这个程序应该打印你输入的所有素数,直到你输入的一个整数,例如:
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
}
}
要fix/improve的事情:
nextPrim
需要 return 每个可能的程序分支中的值。这意味着:考虑nextPrim
在给定范围内找不到任何数字并跳出循环的情况。现在程序将在没有任何 return-value 的情况下卡住。- 您可以打印找到的原始数并保留生成器 运行,而不是 return 找到第一个原始数。很好,很简单,解决了 returning 任何问题,因为你现在可以简单地将
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
函数在您返回时过早终止 i
,请尝试这样的操作:
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);
}
}
}
试一试here!
您的代码存在一些问题,也许我们可以一起解决。首先,您在 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
请注意,您有一个与您 class 同名的方法,但我不认为您将其用作构造函数,如果是,它采用了一个您没有提供的 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);
}
}
}
}
有几个问题:
- 您使用的是 IDE 吗?如果是这样,它是什么,否则为什么不呢?如果您认为自己是初学者,建议您使用 Eclipse IDE 或 NetBeans IDE.
- 关于你的算法,乍一看,编译和逻辑都有问题。
- 编译问题是当你的 class 执行不工作时。在这种情况下,方法
nextPrime(int number)
必须 return 一个int
。尽管您放置了 return 子句,但当素数为false
时,该方法不会 returning 任何值。您可以使用 IDE. 轻松发现此问题
- 另一个编译问题,标记或变量
i
是 INSIDE for 循环,而您正在打印它的值 OUTSIDE。再一次,IDE 会帮助您解决这个问题。 - 逻辑问题是,当且仅当标志
prime
为真时,您才 return 获取一个值,因此,当调用该方法(假设有效)时,您只获得一个值你打电话给System.out.println(matt.nextPrime(number));
正确的实施应考虑以下因素:
- 该方法没有return,即
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); } } }