繁体   English   中英

将素数打印为N值

[英]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和构造函数,这可以解决构造函数签名的问题。
  • 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在那里了,但是当您返回inextPrimes函数将过早终止,请尝试如下操作:

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);
                        }   
                }   
        }   
}

有几个问题:

  1. 您正在使用IDE吗? 如果是这样,那是什么,否则为什么呢? 如果您认为自己是初学者,建议使用Eclipse IDE或NetBeans IDE等。
  2. 关于您的算法,乍一看,这里有一个编译和一个逻辑问题。
  3. 编译问题是当您的类的执行不起作用时。 在这种情况下,方法nextPrime(int number)必须返回一个int 尽管放置了return子句,但当prime为false时,该方法不返回任何值。 您可以使用IDE轻松发现此问题。
  4. 另一个编译问题,前哨或变量i在for循环内,而您正在将其值打印在它的外面。 再次,IDE将帮助您解决此问题。
  5. 逻辑问题是,当且仅当标志prime为true时,您才返回一个值,因此,在调用方法(假设正在工作)时,仅在调用System.out.println(matt.nextPrime(number));时获得一个值System.out.println(matt.nextPrime(number));

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

  1. 该方法不会返回,即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); } } } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM