该程序应该打印所有素数到你输入的int,例如:
https://<company>.au.auth0.com/api/v2/users
我无法让我的程序工作,我真的不知道该怎么做,所以如果有人可以查看它并尝试修复它,那将非常感谢,谢谢。
Enter a Number:
20
2
3
5
7
11
13
17
19
答案 0 :(得分:2)
你已经在那里了。你刚刚在程序流程中遇到了错误。
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
范围内的所有数字。然后再进一步添加功能以过滤掉原始数字。现在你有两个组件可以轻松地相互独立地进行测试。答案 1 :(得分:0)
你几乎就在那里,但当你返回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!
答案 2 :(得分:0)
您的代码存在一些问题,也许我们可以将它们整合在一起。首先,您在return
中错过了nextPrime
语句,并且没有空的默认构造函数PrimeGenerator()
,因为您创建了单个arg构造函数。试试这个:
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!");
}
}
这不是一个能够产生你期望的结果的解决方案,但它至少会编译。从那时起,您可以继续前进并修复算法问题。
答案 3 :(得分:0)
你原来的错误是在。
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);
}
}
}
}
答案 4 :(得分:0)
有几个问题:
nextPrime(int number)
必须返回int
。虽然你放了return子句,但当prime为false
时,该方法不会返回任何值。您可以使用IDE轻松发现此问题。i
位于for循环中,并且您正在打印它的值OUTSIDE。再一次,IDE将帮助您解决这个问题。prime
为真时,才返回值,因此,在调用方法时(假设正在工作),只有在调用System.out.println(matt.nextPrime(number));
时才能获得一个值正确的实施将考虑以下因素:
public void nextPrime(number) { ...
,这意味着您不需要在主方法中打印,只需调用它即可。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);
}
}
}