素数生成器逻辑

2023-12-09

我应该去上课PrimeNumberGenerator其中有一个方法nextPrime这将打印出用户输入的数字之前的所有质数。

Ex)

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 时,一切都会变得混乱且难以阅读。

因此,让我们将这段代码写得尽可能容易理解。我们不会使用任何技巧来加速代码。可读性和正确性是only我们会关心两件事。我们将使用模运算符来检查某物是否可整除。取模类似于整数除法,只不过它返回余数而不是结果。所以 7 / 2 = 2。7 % 2 = 1,因为还剩下 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);
    }
}    

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

最大的问题是我们在另一个循环的中间有这个巨大的循环。这就是让我绊倒的原因。我引用了错误的循环变量。但为什么我们需要循环中的循环呢?读起来是不是舒服多了:

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

对我来说,这更容易阅读。不是因为逻辑变得更容易,而是因为only thing我必须关心的是:

  • 检查所有数字并打印正确的数字,或者
  • 如何检查一个数是否是质数。

由于这两个独立的事情现在分开了,所以你需要同时考虑的事情就少了很多。庆幸吧,因为你刚刚完成了正确的抽象。这使您的代码更容易理解,因为它分离了两个问题。这是制作大型项目的关键方法。你把困难的事情自己解决。然后你可以自己测试它们,并自己使用它们。

(现在我只需要等待反对票来回答你没有明确提出的问题......)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

素数生成器逻辑 的相关文章

  • jvm中本机代码如何转换为机器代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我读过一些文章说 jvm将字节码转换为机器码 jvm将字节码转换为本机代码 jvm 将字节码转换为系统调用 系统调用又由操作系统与硬件
  • 如何实现具有LinkedHashMap类似功能的ConcurrentHashMap?

    我用过LinkedHashMap with accessOrdertrue 并同时允许最多 500 个条目作为数据的 LRU 缓存 但由于可扩展性问题 我想转向一些线程安全的替代方案 ConcurrentHashMap在这方面似乎不错 但缺
  • 通过 html tidy 提供渲染 jsp 页面

    我有一个在 Glassfish 上运行的 Java 项目 它会呈现一些难看的 HTML 这是使用各种内部和外部 JSP 库的副作用 我想设置某种渲染后过滤器 通过 HTMLTidy 提供最终的 HTML 这样源代码就很好且整洁 有助于调试
  • Java中的文字赋值[重复]

    这个问题在这里已经有答案了 定义上有什么区别 double example 23 1d or double example 23 1 为什么long float double可以以l f d结尾 之间没有区别double example 2
  • Spring boot 2.0.5.RELEASE和mongo 4.0连接问题

    我正在关注使用 MongoDB 访问数据教程春季网站 https spring io guides gs accessing data mongodb 我将 Mongo DB 服务器版本 4 安装为服务当我使用客户端连接到它时 它的身份验证
  • 从字符串生成密钥?

    我需要从字符串生成一个密钥 以便我始终可以从同一字符串创建相同的密钥 具体来说是一个Key对象 这样我就可以用它来创建Cipher进而创建SealedObject 这在 Java 中可行吗 我应该考虑什么类 方法组合才能做到这一点 对于 A
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • EMF Eclipse:带有自定义字段(属性)的枚举

    好吧 在 Java 中这是可能的 import org eclipse emf common util Enumerator public enum MyEnum implements Enumerator LITERAL1 0 Name
  • 如何导入 Java 密钥库中现有的 X.509 证书和私钥以在 SSL 中使用?

    我在 ActiveMQ 配置中有这个
  • Java 中的 MP4 容器编写器

    我想找到一个免费的 Java MP4 容器 编写器 我不需要编码器 只需要能够根据预期值写入正确原子的编码器 Bonus对于这样一个库 也可以编写 有效 F4V 我更喜欢纯 Java 解决方案 而不是使用 JNI 或外部可执行文件的解决方案
  • 如何在Java中打印保留2位小数的浮点数?

    我可以用System out print 您可以使用printf http java sun com j2se 1 5 0 docs api java io PrintStream html printf 28java lang Strin
  • 反应式 Spring Webflux REST 控制器内部重定向

    我正在为 spring 反应项目创建简单的控制器服务器 在设置重定向到另一个位置时 我在调用时发现错误http localhost 8080 There was an unexpected error type Internal Serve
  • bufferedinputstream 中标记读取限制有什么用

    我是Java流的新手 我想读取特定的文件内容 然后需要从头开始读取 我创建了一个 BufferedInputStream 但我对 BufferedInputStream mark int markLimit 的文档感到困惑 文档说 publ
  • 春季MVC。方法参数字段的默认值

    我有一个带有方法测试的简单控制器 RequestMapping produces application json ResponseBody public HttpEntity
  • javax.xml.bind.JAXBException: 类 *** 及其任何超类在此上下文中均未知

    我正在尝试通过 REST Web 服务传递对象 以下是我的课程 使用一些示例代码解释了我需要的功能 Rest Web 服务类方法 POST Path find Consumes MediaType APPLICATION FORM URLE
  • Java 验证日期为 yyyyMMddHHmmss

    我想在java中验证给定的日期格式为yyyyMMddHHmmss 状况 应符合格式 yyyyMMddHHmmss 它应该验证当前日期 它应该验证与当前小时有 3 小时或 3 小时差异的小时数 如果满足所有三个条件 Java 方法应返回 tr
  • ASTParser:解析绑定后查找声明节点

    我创建了一个启用了绑定的 AST 当我稍后解析绑定时 我得到了一个有效的 ITypeBinding 但是 当我想要获取绑定的声明 Node 时 它 总是返回 null 除非 ITypeBinding 在 sourceFile 中声明 这是我
  • 在没有EOF的情况下停止读取java中的输入

    In 问题 如何停止读取输入 我的程序继续运行 要求更多输入 public static void main String args throws Exception BufferedReader br new BufferedReader
  • 获取Java中ResultSet返回的行数

    我用过一个ResultSet返回一定数量的行 我的代码是这样的 ResultSet res getData if res next System out println No Data Found while res next code t
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐

  • Plotly:如何在不同的轨迹上绘制带有时间值的标记?

    我有2个数据框 df1 包含列 time bid price df2 包含列 time flag 我想将 df1 的时间序列绘制为折线图 并且我想在 df2 flag 列值 True 的时间点上的点上放置标记 我怎样才能做到这一点 您可以通
  • 从任何地方访问 Azure SQL 数据库

    我们为赛车运动开发了一个基于 SQL 的应用程序 我们的一些客户正在考虑使用 Azure 来保存数据库 问题是他们到世界各地参加比赛 因此需要使用他们拥有的任何互联网连接来访问数据库 并且无法在防火墙规则中预先定义 IP 地址 是否可以有效
  • 如何模拟类方法(+)? [复制]

    这个问题在这里已经有答案了 需要为以下代码编写单元测试 我想对类方法canMakePayments进行mock 返回yes或no 到目前为止没有找到好的方法 因为canMakePayments是一个类方法 似乎所有OCMock方法都用于实例
  • Pandas 根据列中的值将数据帧拆分为多个 csv

    我有个问题与此类似但我需要采取进一步的措施 问题是我的文件包含 50k 多行 每行有 4 个值 Indicator Country Date 和 value 我想根据国家 地区拆分我的 CSV 我不知道有多少个国家 地区 因此所有名称相似的
  • 如何从 Pyspark 中的 Spark 数据帧创建边缘列表?

    我在用graphframes在 pyspark 中进行某些图形类型的分析 并想知道从顶点数据框架创建边列表数据框架的最佳方法是什么 例如 下面是我的顶点数据框 我有一个 id 列表 它们属于不同的组 id group a 1 b 2 c 1
  • 如何在 Python 中解释离散傅里叶变换 (FFT) 的结果

    关于这个主题有很多问题 我已经循环浏览了其中很多问题 获得了有关处理频率的概念性指导 here and here 有关 numpy 函数的文档 here 有关提取幅度和相位的操作信息 here 并走出站点 例如this or this 然而
  • 如何在 C# 中将行筛选的 DataGridView 设置为 DataTable

    我有 DataGridview 我过滤了其中的一些行 我需要将新数据源保存到新的 DataTable 由于某种原因我当前的代码不起作用 这里我如何尝试转换它 LogGridView DataSource as DataTable Defau
  • 通过子项无限嵌套 ngFor

    我发现了一些关于 Angular2 中嵌套 ngFor 循环的问题 但不是我正在寻找的问题 我想在列表中显示类别 我的 JSON 看起来像这样 Categories Title Categorie A Children Title Sub
  • 如何检索 LoaderExceptions 属性?

    我在更新服务参考时收到错误消息 自定义工具警告 无法加载一种或多种请求的类型 检索 LoaderExceptions 属性以获取更多信息 如何检索 LoaderExceptions 属性 Update 当我重新导入域对象项目时 我的错误消失
  • 在张量流中将 1 通道掩模应用于 3 通道张量

    我正在尝试将掩码 二进制 仅一个通道 应用于 RGB 图像 3 个通道 标准化为 0 1 我当前的解决方案是 我将 RGB 图像分割成它的通道 将其与蒙版相乘 然后再次连接这些通道 with tf variable scope apply
  • CodeIgniter 的 CAS 身份验证库

    我正在尝试在 CodeIgniter 应用程序中实现 CAS 身份验证 但我找不到当前是否有为其设置的库 我通过只包含类并添加一些肮脏的修复来进行管理 但如果有人知道合适的库 我认为这将是一个更干净的解决方案 我一直在浏览这里以及谷歌上的一
  • PHP:帮助处理此日期格式

    我正在使用 CodeIgniter 构建一个应用程序 我的 SQL Server 数据库中有包含日期 时间字段的记录 我正在从 m d Y 文本字段中输入的日期查询这些记录 这对应于数据库中的日期格式 不幸的是我在英国 所以我想输入日期 例
  • 如何在创建新计时器之前检查计时器是否处于活动状态

    我在另一个线程上遇到了这个计时器代码 当您按下RaisedButton同时进行多次 每次点击都会增加 1 秒 从而增加减少的速度 有关检查计时器是否已处于活动状态以及是否不让计时器处于活动状态的最简单方法的任何想法RaisedButton创
  • 如何从私有 Docker 注册表中删除镜像?

    我运行一个私人 docker 注册表 我想删除除latest来自存储库 我不想删除整个存储库 只想删除其中的一些图像 这API docs没有提到做到这一点的方法 但肯定有可能吗 目前您无法使用注册表 API 来执行该任务 它只允许您删除存储
  • wamp上安装magento的问题

    大家好 谁能帮我解决安装 magento 时遇到的问题 我的问题是我已经在 wamp 上下载了 magento 在安装过程中我收到了错误 它给出的消息是致命错误 超过了 60 秒的最大执行时间 c wamp www magento lib
  • signalr 我如何从服务器向呼叫者发布消息

    我正在使用 Signalr 1 1 4 因为我仍在使用 net4 所以无法升级到 signalr 2 基本上我想从服务器向调用者发布消息 以避免消息发送到任何未启动进程的客户端 我的集线器类看起来像这样 public class Updat
  • VBScript 中的文件名字符串空格问题

    当我运行此命令时出现错误 但我不确定原因 运行 VBScript 来执行 bat 文件 我想将任何错误消息输出到日志文件 为此 我有以下代码 Set WshShell CreateObject WScript Shell WshShell
  • 如何过滤 Quickblox 用户?

    我想根据应用程序用户的电话号码或电子邮件过滤他们 但我不希望完全匹配 而是用户应返回的部分电子邮件或部分号码作为响应 Quickblox iOS SDK 有办法吗 假设我有一些 Quickblox 用户 如下所示 ID NAME Email
  • Swift 类中的静态与类函数/变量?

    以下代码在 Swift 1 2 中编译 class myClass static func myMethod1 class func myMethod2 static var myVar1 func doSomething myClass
  • 素数生成器逻辑

    我应该去上课PrimeNumberGenerator其中有一个方法nextPrime这将打印出用户输入的数字之前的所有质数 Ex Enter a Number 20 2 3 5 7 11 13 17 19 我们的老师告诉我们应该使用嵌套fo