将Prime数字打印到N值

时间:2016-12-22 22:49:27

标签: java methods primes

该程序应该打印所有素数到你输入的int,例如:

https://<company>.au.auth0.com/api/v2/users

我无法让我的程序工作,我真的不知道该怎么做,所以如果有人可以查看它并尝试修复它,那将非常感谢,谢谢。

 Enter a Number: 
 20
 2
 3
 5
 7
 11
 13
 17
 19

5 个答案:

答案 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和构造函数,它通过构造函数的签名解决了这个问题。
  • 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范围内的所有数字。然后再进一步添加功能以过滤掉原始数字。现在你有两个组件可以轻松地相互独立地进行测试。

答案 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)

有几个问题:

  1. 您使用的是IDE吗?如果是这样,那就是它,否则为什么不呢?如果您认为自己是初学者,请建议使用Eclipse IDE或NetBeans IDE。
  2. 关于你的算法,乍一看,有编译和逻辑问题。
  3. 编译问题是当您的班级执行不起作用时。在这种情况下,方法nextPrime(int number)必须返回int。虽然你放了return子句,但当prime为false时,该方法不会返回任何值。您可以使用IDE轻松发现此问题。
  4. 另一个编译问题是,标记或变量i位于for循环中,并且您正在打印它的值OUTSIDE。再一次,IDE将帮助您解决这个问题。
  5. 逻辑问题是,当且仅当标志prime为真时,才返回值,因此,在调用方法时(假设正在工作),只有在调用System.out.println(matt.nextPrime(number));时才能获得一个值
  6. 正确的实施将考虑以下因素:

    1. 该方法不会返回,即public void nextPrime(number) { ...,这意味着您不需要在主方法中打印,只需调用它即可。
    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);
              }
          }
      }