java 最大素数,JAVA计算指定上限的最大素数
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计算指定上限的最大素数相关推荐
- 日是这一年的等几天Java代码_java中计算指定日期是一年的第几天的方法
Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...
- java计算指定日期的上个月
文章目录 java计算指定日期的上个月 Calendar类 API 代码实现 java计算指定日期的上个月 Calendar类 Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方 ...
- RedisGeo实现增删改查 java计算指定坐标最近的距离并排序
利用Redis的Geo功能实现查找附近的位 - 云+社区 - 腾讯云 package com.easy.hotel.pms.util;import com.easy.hotel.common.data ...
- 根据经纬度计算指定范围内或者附近的人(java)
文章目录 根据经纬度计算指定范围内或者附近的人(java) 前言 实现 根据经纬度计算指定范围内或者附近的人(java) 前言 最近项目中有一个需求,就是在地图中随便标一个点位,然后根据这个点位显示出 ...
- java 一年中的第几天_java中计算指定日期是一年的第几天的方法
Java输入日期计算是这年的第几天: 思路 通过年份区分出是闰年还是平年,平年 2 月 28 天,闰年 2 月 29 天: 1.3.5.7.8.10.12 月份 31 天其余月份均为 30 天: 然后 ...
- Java语言程序设计(一)计算题
1.观察下面的程序片断,指出其中的父类和子类,以及父类和子类的各个域和方 法. class SuperClass {int data; voidsetData(intnewData) {data=ne ...
- java中商业数据计算时用到的类BigDecimal和DecimalFormat
1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确 ...
- Java对象内存大小计算
背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...
- Java基础 - 第一章 计算
为什么80%的码农都做不了架构师?>>> #1.1 第一个Java程序 package my.hava.javabasis.lesson;/*** Created by zha ...
- 编译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 ...
最新文章
- 深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路
- 修改MAC ADDRESS
- c++重载后置++和--
- mxnet制作人脸识别训练集
- 使用beanUtils操纵javabean
- 联机装箱问题 java_Java实现 洛谷 P1049 装箱问题
- linux电视改安卓,mstar安卓智能电视方案源代码常用修改
- C语言作业不足之处,C语言和汇编语言的优缺点分析-控制器/处理器-与非网
- PHP array_map()
- kerberos安装配置与使用
- Android ViewPager+TabHost实现首页导航
- 基于熵权法评估某高校各班级整体情况(公式详解+简单工具介绍)
- EMBER-网络安全恶意软件公开数据集,论文的翻译,自己的笔记
- Mathtype(2),用于创建此对象的程序是 Equation。您的计算机尚未安装此程序或此程序无响应。
- 域名绑定SSL阿里云免费证书
- 安装deepin微信报错: dpkg: 依赖关系问题使得 deepin.com.wechat:i386 的配置工作不能继续 解决办法如下:
- 江苏机器人竞赛南航_第十届江苏省大学生机器人大赛
- amd电脑安装Android失败,AMD显卡驱动安装失败
- 勤哲excel服务器模板中excel公式失效的解决办法
- 腾讯音乐(K歌)的粗排模型