开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

如何用 Java 判断一个给定的数是不是素数

有关素数的定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。 生成素数的算法 在我们论坛中我们给出了一个有关素数生成算法。 这个是一个公司的面试题目,请参考 Prime numbers from 1 to 100 (打印 100 以内的素数) 页面中的内容。 如何判断一个数是不是素数 为什么要判断一个数是不是素数?因为质数 非常重要,随之数字越来越大,那么在计算时候的时间复杂度越来越高,因此我们需要快速判断一个数是不是质数。 这个问题你可能需要了解下 米勒-拉宾检验( Miller–Rabin primality test) 这个东西。 米勒-拉宾素性检验是一种素数判定法则,利用随机化算法判断一个数是合数还是可能是素数。卡内基梅隆大学的计算机系教授Gary Lee Miller首先提出了基于广义黎曼猜想的确定性算法,由于广义黎曼猜想并没有被证明,其后由以色列耶路撒冷希伯来大学的Michael O. Rabin教授作出修改,提出了不依赖于该假设的随机化算法。 Java 原生 下面的代码是 Java 原生代码解决的方法。 Boolean isPrime = number > 1 && IntStream.rangeClosed(2, (int) Math.sqrt(number)) .noneMatch(n -> (number % n == 0)); 上面的代码使用了IntStream,并且使用数学的 Math 来进行计算。 上面的代码不太好读,可能你大部分时候都不会这么去写。 BigInteger 方法 我们可以使用 BigInteger 的 isProbablePrime 方法来近似判断。 这个近似判断就使用了 米勒-拉宾素性检验。 在面试的时候,使用这个方法就可以了,因为有时候一些 online 的 code 平台不会提供第三方的工具让你使用。 int number = 10; BigInteger.valueOf(number).isProbablePrime(100); Apache Math3 这个方法就非常简单了,直接用就可以了。 也是所有方法中检验效果最好,速度最快的。 int number = 10; Primes.isPrime(number) 为什么呢?这是因为 Apache 的 Commons Math3 使用了一个数组,把一定范围内的素数都列出来了。 简单粗暴,所以效率最高。     范围就是 Java 整数不溢出的情况下进行判断的。 结论 素数可能会经常用到,尤其在随机数算法的时候。 同时又因为算法无法覆盖掉所有的素数,因此很多公司面试的时候都会喜欢用这个题目来为难你。 完整的代码如下: @Test public void testIsPrime() { int number = 10; Boolean isPrime = number > 1 && IntStream.rangeClosed(2, (int) Math.sqrt(number)) .noneMatch(n -> (number % n == 0)); logger.debug(" {} Prime CORE Check is - [{}]", number, isPrime); logger.debug(" {} Prime BigInteger Check is - [{}]", number, BigInteger.valueOf(number).isProbablePrime(100)); logger.debug(" {} Prime APACHE MATH3 Check is - [{}]", number, Primes.isPrime(number)); } 上面测试代码的输出结果为: 15:37:02.403 [main] DEBUG com.ossez.toolkits.codebank.tests.algorithm.PrimeNumbersTest - 10 Prime CORE Check is - [false] 15:37:02.406 [main] DEBUG com.ossez.toolkits.codebank.tests.algorithm.PrimeNumbersTest - 10 Prime BigInteger Check is - [false] 15:37:02.411 [main] DEBUG com.ossez.toolkits.codebank.tests.algorithm.PrimeNumbersTest - 10 Prime APACHE MATH3 Check is - [false] Process finished with exit code 0 其实我们这样看,是不是简单粗暴就是最好的呢?   https://www.ossez.com/t/java/13749

2021年09月24日 0Comments 662Browse 1Like Read more
Computer Science

Java 中的 NaN

概述 简单来说可以认为 NaN 是一个数字数据类型变量值,这个类型变量被定义为 这不是一个数字。 在这篇文章中,我们对 Java 中的 NaN 进行一些简单的描述和说明和在那些操作的过程中可以尝试这个值,和可以如何去避免。 什么是 NaN NaN 通常表示一个无效的操作结果。 例如,你尝试将数字 0 去除以 0,这个在数学中是不存在的,同时在 Java 中定义 NaN 也确实就是通过这个不存在的操作来定义的。 我们通常也使用 NaN 来表示不能显示的变量值。 例如,我们对数字 -1 开平方根的时候,也是这种情况。 例如我们可以只在负数的情况下描述 value (i) 。 在页面 IEEE 754 - 维基百科,自由的百科全书 中对非数值 NaN 的定义进行了说明。你可以阅读上面的文章来了解更多有关 NaN 的定义。 在 Java 中,只有浮点数据类型 float 和 double 实现了这个标准。 Java 咋 使用 Float.NaN 和Double.NaN 来定义了 NaN 构造函数。     在 double 中一个常量 Not-a-Number (NaN) 定义了这个值,这个值等于 Double.longBitsToDouble(0x7ff8000000000000L) 的返回值。 和 在 float 中一个常量 Not-a-Number (NaN) 定义了这个值,这个值等于 Float.intBitsToFloat(0x7fc00000) 的返回值。 在 Java 中没有针对其他数据类型定义的 NaN 了。 NaN 的比较 在 Java 中,如果我们开始写一个方法的时候,我们应该需要针对方法的输入数据进行检查,以确保输入数据的准确和输入数据在允许的范围内。 NaN 在绝大部分情况下都不是一个有效的输入参数,因此在 Java 的方法中,我需要对输入的参数进行比较,以确保输入的参数中的值不是 NaN,然后我们能够对输入参数进行正确的处理。 NaN 不能余任何浮点类型数据进行比较,这就表示,任何有 NaN 参与的比较都会返回 false(这里只有一个例外为 “!=” 将会返回 true)。 我们将会得到 针对 x != x 表达式,如果 x 是 NaN 的话,我们将会在这里得到 true。 考察下面的代码: System.out.println("NaN == 1 = " + (NAN == 1)); System.out.println("NaN > 1 = " + (NAN > 1)); System.out.println("NaN < 1 = " + (NAN < 1)); System.out.println("NaN != 1 = " + (NAN != 1)); System.out.println("NaN == NaN = " + (NAN == NAN)); System.out.println("NaN > NaN = " + (NAN > NAN)); System.out.println("NaN < NaN = " + (NAN < NAN)); System.out.println("NaN != NaN = " + (NAN != NAN)); 下面的内容就是针对上面代码的输出结果。 NaN == 1 = false NaN > 1 = false NaN < 1 = false NaN != 1 = true NaN == NaN = false NaN > NaN = false NaN < NaN = false NaN != NaN = true 所以,我们不能够通过比较来检查数据是不是 NaN。 事实上,我们也不应该用 “==” 或 “!= “ 来对 double 或者 flat 类型的数据进行比较。 所以,我们可以使用 “x != x”* 表达式来检查 NaN 是不是为 true。 更多的,我们可能会使用 Float.isNaN 和Double.isNaN 方法来检查这个输入的参数值是不是 NaN。 实际上,这种方法更好,因为这能够让代码更加易读。 考察下面的代码: double x = 1; System.out.println(x + " is NaN = " + (x != x)); System.out.println(x + " is NaN = " + (Double.isNaN(x))); x = Double.NaN; System.out.println(x + " is NaN = " + (x != x)); System.out.println(x + "…

2021年09月24日 0Comments 683Browse 0Like Read more
Computer Science

Confluence OGNL 注入漏洞的严重安全问题

在 2021年的9月, Confluence 遇到了非常严重的安全问题。 OGNL 代表对象图导航语言;它是一种表达语言,用于获取和设置 Java 对象的属性,以及其他附加功能,例如列表投影和选择以及lambda表达式。您可以使用相同的表达式来获取和设置属性值。 CVE-2021-26084 - Confluence Server Webwork OGNL injection https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html 这个问题影响非常大,需要马上修复。 否则将会遇到非常严重的服务器安全隐患,如被注入代码后,你的服务器 CPU 利用率会全部高达 100%。     同时影响的版本也非常大。 建议马上修复,以避免受到攻击。   https://www.ossez.com/t/confluence-ognl/13745

2021年09月22日 0Comments 654Browse 0Like Read more
Computer Science

Node 的 cross-env 模块

cross-env 是运行跨平台设置的和使用环境变量(Node中的环境变量)的脚本。 一句话来说明 cross-env,就是针对相同的语句和命令,我们希望这条语句能够同时在 Windows 和 Linux 上使用。     为什么需要 cross-env 这个问题主要是因为不同的操作系统平台对 Shell 脚本的支持情况不一样导致的。 例如,如果你希望在 Windows 中使用命令NODE_ENV=production 来设置环境变量的话,大多数Windows 命令提示符都没有办法进行操作。 同样的,Windows 和 POSIX 命令使用环境变量的方式也有所不同。 对于POSIX,您可以使用:$ENV_VAR ,但是在 Windows 上需要使用 %ENV_VAR% 来设置环境变量。 上面的情况就是针对不同的操作系统平台,设置环境变量中使用的变量引用是不同的。 例如,我们常常用到的设置环境变量。 针对不同的操作系统环境 windows set NODE_ENV=production linux export NODE_ENV=production 同样的意思,如果我们需要根据不同的操作系统进行不同的设置的话是不是非常麻烦呀。 因此我们 cross-env 就能够大显身手了。 安装 如果你在使用的时候遇到了: > Code@1.0.0 dev /home/vagrant/Code > cross-env NODE_ENV=development webpack --progress --hide-modules sh: 1: cross-env: not found 这个提示的话,就说明你的系统平台中没有安装 cross-env。 你可以运行 sudo npm install --global cross-env 来进行安装和配置。   https://www.ossez.com/t/node-cross-env/13733

2021年09月11日 0Comments 1100Browse 0Like Read more
Computer Science

如何禁用 Gmail 的分类(Categories )标签

Gmail 的默认界面提供了一个 Categories 标签。 如果下图:     这个标签会对收到的邮件进行默认分类。 但是有时候因为这个分类的存在,导致我们经常找不到邮件,很多人可能还是习惯按照时间的顺序来处理邮件。 你是可以禁用这个分类的。 进入设置 单击右上角的齿轮图标。 然后会弹出一个界面,在弹出的界面中选择查看所有设置。 Inbox 设置 然后在进入的设置中,选择 Inbox 标签页。 在 Inbox 标签页下面有一个分类选项。在默认情况下 Primary 是被选择的。 对不需要的其他分类,取消选择就可以了。     保存退出 然后到本页面的最下面。 选择 Save 保存按钮,保存退出后你的 Gmail 邮箱 Inbox 界面就会被刷新了。     这时候,你的邮箱是完全按照时间的顺序进行排序的,这样可能会符合很多人处理邮件的习惯。   https://www.ossez.com/t/gmail-categories/13732

2021年09月11日 0Comments 823Browse 0Like Read more
Computer Science

JavaScript 的 Math.floor() 函数

Math.floor() 返回小于或等于一个给定数字的最大整数。 可以理解 Math.floor()为向下取整。 与其相对的是 Math.ceil() ,这个是向上取整。 如下面的代码: Math.floor( 45.95); // 45 Math.floor( 45.05); // 45 Math.floor( 4 ); // 4 Math.floor(-45.05); // -46 Math.floor(-45.95); // -46 上图演示了这个函数的一些小对比。   https://www.ossez.com/t/javascript-math-floor/13731

2021年09月11日 0Comments 955Browse 0Like Read more
Computer Science

JavaScript 的 Math.ceil() 函数

Math.ceil() 函数返回大于或等于一个给定数字的最小整数。 需要注意的是 如果运行 Math.ceil(null) ,这个函数将会返回整数 0 而不会给出一个 NaN 错误。 请考察下面的代码: console.log(Math.ceil(.95)); // expected output: 1 console.log(Math.ceil(4)); // expected output: 4 console.log(Math.ceil(7.004)); // expected output: 8 console.log(Math.ceil(-7.004)); // expected output: -7 需要注意的是,如果是负数的话,那么获得整数就是舍去掉小数部分的整数了。   https://www.ossez.com/t/javascript-math-ceil/13730

2021年09月11日 0Comments 868Browse 0Like Read more
Computer Science

NVM 如何切换版本

首先使用 nvm ls 列出当前安装的所有版本。 然后使用 nvm use 14.17.0 来选择不同的版本。     nvm use 后面跟的是版本号。 当切换完成后,可以使用 node -v 来查看重新定义的版本。   https://www.ossez.com/t/nvm/13729

2021年09月11日 0Comments 789Browse 0Like Read more
Computer Science

Npm 安装提示 EUNSUPPORTEDPROTOCOL 错误

完整的错误信息为: 14 verbose stack Error: Unsupported URL Type "npm:": npm:@elastic/elasticsearch@7.13.0 14 verbose stack at unsupportedURLType (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\npm-package-arg\npa.js:197:15) 14 verbose stack at fromURL (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\npm-package-arg\npa.js:250:13) 14 verbose stack at Function.resolve (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\npm-package-arg\npa.js:71:12) 14 verbose stack at module.exports (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\lib\install\realize-shrinkwrap-specifier.js:21:14) 14 verbose stack at BB.each (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\lib\install\inflate-shrinkwrap.js:51:23) 14 verbose stack at tryCatcher (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\util.js:16:23) 14 verbose stack at Object.gotValue (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\reduce.js:155:18) 14 verbose stack at Object.gotAccum (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\reduce.js:144:25) 14 verbose stack at Object.tryCatcher (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\util.js:16:23) 14 verbose stack at Promise._settlePromiseFromHandler (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\promise.js:512:31) 14 verbose stack at Promise._settlePromise (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\promise.js:569:18) 14 verbose stack at Promise._settlePromise0 (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\promise.js:614:10) 14 verbose stack at Promise._settlePromises (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\promise.js:693:18) 14 verbose stack at Async._drainQueue (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\async.js:133:16) 14 verbose stack at Async._drainQueues (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\async.js:143:10) 14 verbose stack at Immediate.Async.drainQueues (C:\Users\huyuc\AppData\Roaming\nvm\v8.9.4\node_modules\npm\node_modules\bluebird\js\release\async.js:17:14) 15 verbose cwd D:\WorkDir\FacilityConneX\Source-Code\Services\API 16 verbose Windows_NT 10.0.19043 17 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "--frozen-lockfile" 18 verbose node v8.9.4 19 verbose npm v5.6.0 20 error code EUNSUPPORTEDPROTOCOL 21 error Unsupported URL Type "npm:": npm:@elastic/elasticsearch@7.13.0 22 verbose exit [ 1, true ] 从上面的错误信息我们来抓重点看就是第一行 verbose stack Error: Unsupported URL Type "npm:": npm:@elastic/elasticsearch@7.13.0 Unsupported URL Type 这个错误。 错误原因和解决 出现这个错误的原因是你的 node 版本可能过低了。 你需要切换使用更高一点的 node 版本。 如果你对切换 node 的版本和 NPM 之间的关系有什么不清楚的话,可以参考下面的内容:NPM 和 NVM 当你切换 node 版本完成后,再次尝试安装就应该能够解决你的这个问题了。     当我们切换版本完成后再次进行安装,就能够成功了。   https://www.ossez.com/t/npm-eunsupportedprotocol/13728

2021年09月11日 0Comments 1183Browse 0Like Read more
Computer Science

IntelliJ IDEA 快速插入 for 循环

在写代码的时候,我们会经常会对数组或者集合进行一些遍历。 聪明的你肯定想快速插入类似下面的代码,定义一个 int i ,然后 i 从 0 开始对集合进行遍历。 for (int i = 0; i < testList.size(); i++) { } IntelliJ IDEA 的 fori 解决办法 在空白处,直接输入 for 在你输入 for 以后,你应该能够看到下面的小窗口。     在上面的小窗口中,选择 fori,随后你的 IntelliJ IDEA 将会自动为你插入下面的代码。 for (int i = 0; i < ; i++) { } 使用上面的代码,你就不用再敲打一次 int i 这种定义了。     能够帮忙你解决定义整型的麻烦。 IntelliJ IDEA 的 foreach 解决办法 我们知道 Java 在 JDK 5 以后的循环还有另外一种写法。 在这里,你可以使用 foreach 解决办法。     上面 foreach 的解决办法将会帮你插入: for (: ) { } 这个语句。     然后你就可以在上面的语句中直接对集合进行遍历了。 总结 使用 IntelliJ IDEA 的快捷键和语法提示能够帮我们提高编码效率。 对集合进行遍历或者查找是程序中经常用到的方法,希望上面的这个小技巧能够帮忙少敲几个变量定义。   https://www.ossez.com/t/intellij-idea-for/13726

2021年09月08日 0Comments 666Browse 0Like Read more
1…123124125126127…304
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (523)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1