将质数打印为 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);
                        }   
                }   
        }   
}

有几个问题:

  1. 您使用的是 IDE 吗?如果是这样,它是什么,否则为什么不呢?如果您认为自己是初学者,建议您使用 Eclipse IDE 或 NetBeans IDE.
  2. 关于你的算法,乍一看,编译和逻辑都有问题。
  3. 编译问题是当你的 class 执行不工作时。在这种情况下,方法 nextPrime(int number) 必须 return 一个 int。尽管您放置了 return 子句,但当素数为 false 时,该方法不会 returning 任何值。您可以使用 IDE.
  4. 轻松发现此问题
  5. 另一个编译问题,标记或变量 i 是 INSIDE for 循环,而您正在打印它的值 OUTSIDE。再一次,IDE 会帮助您解决这个问题。
  6. 逻辑问题是,当且仅当标志 prime 为真时,您才 return 获取一个值,因此,当调用该方法(假设有效)时,您只获得一个值你打电话给 System.out.println(matt.nextPrime(number));

正确的实施应考虑以下因素:

  1. 该方法没有return,即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);
            }
        }
    }