java 生成素数_java – 素数生成器逻辑

我应该创建一个类PrimeNumberGenerator,它有一个方法nextPrime,它将打印出所有素数,直到用户输入的数字.

例)

Enter a Number:

20

2

3

5

7

11

13

17

19

我们的老师告诉我们,我们应该使用嵌套的for循环.我试过了,但是当我试图制作内部(嵌套)循环时,我真的很困惑.

这是我的代码:

(我稍后会做一个测试课)

public class PrimeGenerator {

private int num;

boolean isPrime;

public PrimeGenerator(int n)

{

num = n;

}

public int nextPrime (int num)

{

for (int i=2; i < num; i++) // The first prime number is 2 and the prime numbers only have to go up to a number the user inputs.

{

for (int j = 3; j<=i/2; j+=2) // The next prime number is 3 and I attempted to loop through to get the next odd number.

{

if (num % i == 0) //if the number (upper limit) mod a "prime number" is 0, then that means that number is not really "prime" after all.

{

break;

}

}

}

return num;

}

}

解决方法:

这里有两个你忘了问的问题:

>为什么嵌套循环会使一切变得如此复杂?

>我能做些什么才能让事情再次复杂化?

让我们一起玩你实际问的问题,然后回答前两个问题.

您想要做的事情可能如下所述:

对于每个数字,1-n,其中n由用户输入,如果它是素数则打印它.

好的,让我们在这里写下伪代码/逻辑.

它看起来像Java,但事实并非如此.这只是为了传达我们的目标:

int largestNumber = readIntegerFromKeyboard();

for all ints i from 1 to largestNumber {

if(isPrime(i)) {

println(i);

}

}

所以,让我们这样做!但首先,我们需要一份清单,列出我们需要做的所有事情:

>从键盘读取整数

>循环数字

>检查数字是否为素数

>打印素数(换行)

让我们先做两件容易的事.读取输入并设置循环:

Scanner keyboard = new Scanner(System.in);

int largestNumber = keyboard.nextInt();

for(int i = 1; i <= largestNumber; ++i) {

if(isPrime(i)) {

System.out.println(i);

}

}

keyboard.close();

好的,这似乎很简单.到目前为止,这里的一切都有意义.这很容易理解逻辑.

然而,现在,当我们用实际逻辑替换isPrime时,一切都将变得混乱且难以阅读.

因此,让我们尽可能简单地理解这段代码.我们将不使用任何技巧来加速代码.可读性和正确性是我们唯一关心的两件事.我们将使用模运算符来检查某些东西是否可以均匀分割. Modulo就像整数除法,除了它返回余数而不是结果.所以7/2 = 2. 7%2 = 1,因为剩下一个.

Scanner keyboard = new Scanner(System.in);

int largestNumber = keyboard.nextInt();

for(int i = 1; i <= largestNumber; ++i) {

// checks if the number is a prime or not

boolean isPrime = true;

for(int check = 2; check < i; ++check) {

if(i % check == 0) {

isPrime = false;

}

}

if(isPrime) {

System.out.println(i);

}

}

所以好消息是,这是有效的.

坏消息是,这比必要的阅读更难.我们在这里做的不是很多.当我写这篇文章时,我犯了几个愚蠢的错误,混淆了变量.也许我很蠢.所以也许我应该在那种情况下写出愚蠢的代码. ;)另一方面,你不是傻瓜.但是你可能和我一起工作,这是愚蠢的,所以你必须自己编写愚蠢的代码,这样你才能有效地与我合作.

最大的问题是我们在另一个循环的中间有这个大规模的循环.这就是让我失望的原因.我提到了错误的循环变量.但为什么我们需要循环中的循环?读起来不是很舒服:

if(isPrime(i)) {

System.out.println(i);

}

而不是整个混乱?你的教授指出了嵌套循环.但是它让你失望了.相反,只需编写isPrime方法即可.事实是,对于我曾经遇到的每一个嵌套循环实例都是如此.所以让我们看看它的外观如何:

class Homework {

public static void main(String[] args) {

Scanner keyboard = new Scanner(System.in);

int largestNumber = keyboard.nextInt();

for(int i = 1; i <= largestNumber; ++i) {

if(isPrime(i)) {

System.out.println(i);

}

}

keyboard.close();

}

/**

* Checks is a positive integer is a prime number

*/

public static boolean isPrime(int number) {

for(int check = 2; check < number; ++check) {

if(number % check == 0) {

return false;

}

}

return true;

}

}

这对我来说更容易阅读.不是因为逻辑变得容易,而是因为我唯一需要关心的是:

>检查所有数字并打印正确的数字,或

>如何检查数字是否为素数.

由于这两个独立的东西现在是分开的,你可以立刻想一想.高兴,因为你刚刚做了一个适当的抽象.这使您的代码更容易理解,因为它将这两个问题分开.这是制作大型项目的关键方式.你采取困难的事情并自己做.然后你可以自己测试它们,并自己使用它们.

(现在我只需要等待回答你没有明确要求的问题的downvotes ……)

标签:java,primes

来源: https://codeday.me/bug/20191007/1866178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值