num=num+"0";

}

return num;

}

算法1在输入为10的8次方(即1亿)时,用时1102毫秒。输入为10的9次方时,算法1就力不从心了,算了超过10秒还没有出来结果。

从算法上来看,主要的问题在于n往下减的速度太慢,每次都减1,其实n可以一步到位算出,优化后得到算法2:

/*

* 使用对撞指针,下限步长为1,上限一步到位

*/

public static int maxPrime2(int num) {

int i = num;

while (i > 1) {

int m = 2, n = i/m;

while (m

if (m * n == i) {

break;

} else if (m * n > i) {

n=i/m;

} else {

m++;

}

}

if (m > n) {

return i;

}

i--;

}

return 1;

}

算法2在输入为10的8次方时,用时1毫秒。输入为10的9次方时,用时也是1毫秒。输入为10的10次方时,超过了JAVA中int类型的上限,不能计算了。

于是修改算法2的输入类型,由int换成long,修改后得到算法3:

/*

* 使用对撞指针,下限步长为1,上限一步到位

*/

public static long maxPrime3(long num) {

long i = num;

while (i > 1) {

long m = 2, n = i/m;

while (m

if (m * n == i) {

break;

} else if (m * n > i) {

n=i/m;

} else {

m++;

}

}

if (m > n) {

return i;

}

i--;

}

return 1;

}

算法3在输入为10的10次方时,用时7毫秒。输入为10的15次方时,用时也是893毫秒。输入为10的16次方时,用时是5299毫秒,得到最大素数为9999999999999937。输入为10的17次方时,算了超过10秒还没有出来结果。

因为long还是有数值的限制,于是考虑换成没有限制的BigInteger,得到算法4:

/*

* 使用对撞指针,下限步长为1,上限一步到位

*/

public static BigInteger maxPrime4(BigInteger num) {

BigInteger i = num;

BigInteger num1 = new BigInteger("1");

while (i.compareTo( num1) > 0) {

BigInteger m = new BigInteger("2"), n = i.divide(m);

while (m.compareTo(n)

BigInteger i2=m.multiply( n);

if (i2.compareTo(i) == 0) {

break;

} else if (i2.compareTo(i)> 0) {

n=i.divide(m);

} else {

m=m.add(num1);

}

}

if (m.compareTo(n) > 0) {

return i;

}

i=i.subtract(num1);

}

return num1;

}算法4在输入为10的15次方时,用时8974毫秒。输入为10的16次方时,算了超过10秒还没有出来结果。由此可见BigInteger的计算消耗比long要大,优点是没有数据的上限的限制。

以上4种算法的效率对比如下:

另外也测了下指定上限算出全部素数的算法,代码如下:

/*

* 使用对撞指针,下限步长为1,上限一步到位

*/

public static long maxPrimeSet(long num) {

Setprimes=new HashSet();

Long maxPrime=2L;

primes.add(maxPrime);

for(long i=3;i

boolean isPrime=true;

for (long prime : primes) {

if(i/prime*prime==i) {

isPrime=false;

break;

}

}

if(isPrime) {

maxPrime=i;

primes.add(maxPrime);

}

}

System.out.println("素数个数:"+primes.size());

return maxPrime;

}

结果最大输入为10的5次方(再增加超过10秒还没有结果),输出如下:

素数个数:9592

最大素数: 99991

用时:2747毫秒

以上是关于最大索数计算的小探索,希望有兴趣的朋友可以帮看下上面的算法能否进一步优化,算出更大的结果。

java 最大素数,JAVA计算指定上限的最大素数相关推荐

  1. 日是这一年的等几天Java代码_java中计算指定日期是一年的第几天的方法

    Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...

  2. java计算指定日期的上个月

    文章目录 java计算指定日期的上个月 Calendar类 API 代码实现 java计算指定日期的上个月 Calendar类 Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方 ...

  3. RedisGeo实现增删改查 java计算指定坐标最近的距离并排序

    利用Redis的Geo功能实现查找附近的位 - 云+社区 - 腾讯云 package com.easy.hotel.pms.util;import com.easy.hotel.common.data ...

  4. 根据经纬度计算指定范围内或者附近的人(java)

    文章目录 根据经纬度计算指定范围内或者附近的人(java) 前言 实现 根据经纬度计算指定范围内或者附近的人(java) 前言 最近项目中有一个需求,就是在地图中随便标一个点位,然后根据这个点位显示出 ...

  5. java 一年中的第几天_java中计算指定日期是一年的第几天的方法

    Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...

  6. Java语言程序设计(一)计算题

    1.观察下面的程序片断,指出其中的父类和子类,以及父类和子类的各个域和方 法. class SuperClass {int data; voidsetData(intnewData) {data=ne ...

  7. java中商业数据计算时用到的类BigDecimal和DecimalFormat

    1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确 ...

  8. Java对象内存大小计算

    背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...

  9. Java基础 - 第一章 计算

    为什么80%的码农都做不了架构师?>>>    #1.1 第一个Java程序 package my.hava.javabasis.lesson;/*** Created by zha ...

  10. 编译java程序时用于指定生成class_(15 )在编译 Java 程序时,用于指定生成 .class 文件位置的选项是A ) -g B ) -d C ) -verbose D...

    (15 )在编译 Java 程序时,用于指定生成 .class 文件位置的选项是A ) -g B ) -d C ) -verbose D 更多相关问题 如图①,在△ABC中,AB=AC,∠BAC=90 ...

最新文章

  1. 深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路
  2. 修改MAC ADDRESS
  3. c++重载后置++和--
  4. mxnet制作人脸识别训练集
  5. 使用beanUtils操纵javabean
  6. 联机装箱问题 java_Java实现 洛谷 P1049 装箱问题
  7. linux电视改安卓,mstar安卓智能电视方案源代码常用修改
  8. C语言作业不足之处,C语言和汇编语言的优缺点分析-控制器/处理器-与非网
  9. PHP array_map()
  10. kerberos安装配置与使用
  11. Android ViewPager+TabHost实现首页导航
  12. 基于熵权法评估某高校各班级整体情况(公式详解+简单工具介绍)
  13. EMBER-网络安全恶意软件公开数据集,论文的翻译,自己的笔记
  14. Mathtype(2),用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。
  15. 域名绑定SSL阿里云免费证书
  16. 安装deepin微信报错: dpkg: 依赖关系问题使得 deepin.com.wechat:i386 的配置工作不能继续 解决办法如下:
  17. 江苏机器人竞赛南航_第十届江苏省大学生机器人大赛
  18. amd电脑安装Android失败,AMD显卡驱动安装失败
  19. 勤哲excel服务器模板中excel公式失效的解决办法
  20. 腾讯音乐(K歌)的粗排模型

热门文章

  1. Android 最常用的设计模式二 安卓源码分析——组合模式(component)
  2. ffmpeg转换进度计算公式
  3. 域名交易的信息差,原来还可以这样赚钱
  4. 正交性,从內积开始到施密特正交化
  5. CTC loss 理解
  6. git如何下载代码:
  7. C++实现图片格式转换
  8. php smtp.163 端口号,常用的邮箱服务器(SMTP、POP3)地址、端口
  9. 零基础小白深度学习入门篇
  10. 施密特触发器——用于正弦波转方波、脉冲波整形