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

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

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

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

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

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

对于每个数字,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 ……)

1. 输出50—100间的所有素数,其中判断一个数是否为素数用函数完成。 2. 设计一个学生成绩管理系统,能输入学生的学号、姓名和成绩等数据,能按成绩从高到低进行排序,并能将排序的结果输出。 提示: 设计一个学生类student,包含三个私有数据成员,即学号sno、姓名sname和成员score; 在学生类student中再设计三个方法 setdata、display和getscore,分别用于完成输入学生信息、输出学生信息、返回某个学生成绩的功能; 定义一个manage类,它有一个student类型的私有数据成员s[num],其中num表示学生人数; 在manage类中分别定义三个方法input、output、sort,分别用于完成输入、输出和排序功能。 3.一个电子产品商店里卖各种电子产品,以下是几种产品类信息。 产品Product 的属性信息包括: 产品号(number) 种类(category) 名称(name) 价格(price ) 计算机Computer除具有产品基本信息外,还可能具有下面的属性: 内存(memory) 处理器(processorName)   笔记本电脑Laptop 除具有产品基本信息外,还可能具有下面的属性: 厚度(thickness) 重量(weight) 根据以上信息,首先抽象出类Product,它派生出子类Computer,Computer又派生出它的子类Laptop,实现以上三个类的定义,定义相应的构造方法,声明一个测试类,生成类对象,并把打印结果显示在屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值