使用java编写判断自然数是否为素数的方式是,使用scanner来接受用户输入的数值,使用素数的算法,实例如下:
Scanner sr = new Scanner(System.in)System.out.print("请输入a的值:")
脊烂int a = sr.nextInt()
boolean is = true
if (a < 1)
{
System.out.println(a + "不是质数,因为他小于一")
}
else
{
List<Integer> list = new ArrayList<Integer>()
for (int i = 2 i < a i++)
{
if (a % i != 1 && a % i != a)
燃卖 {
if (a % i == 0){
is=false
list.add(i)
}
}
}
if(is){
System.out.println("a是质数")
}else{
String yz=""
for (int i = 0 i < list.size() i++)
{
if (yz=="")
{
yz=yz+list.get(i)
樱段漏 }else{
yz=yz+","+list.get(i)
}
}
System.out.println("a不是质数,因为他含有因子"+yz)
}
}
我写了几种方法,并逐步优化,并且对每一种方法进行了1000000次的调用测试每种方法的速度,仅供参考:
import java.math.BigIntegerpublic class Test_04 {
/**
* 最笨重的一种方法,用该整数分别除以比它小的数,看是否能被整除
*/
public boolean isPrimeNum_1(int num) {
// 识别小于2的数
if (num < 2) {
return false
}
for (int i = 2 i < num i++) {
if (num % i == 0) {
return false
}
}
return true
}
/**
* 优化第一种方法<br>
* 1、偶数不可能是质数<br>
* 2、对于大于2的数,如果一个数a大于数b的一半,那么b不可能被a整除
含悄薯 */
public boolean isPrimeNum_2(int num) {
// 2特殊处理
if (num == 2) {
return true
}
// 识别小于2的数和偶数
if (num < 2 || num % 2 == 0) {
return false
}
int max = num / 2
for (int i = 3 i < max i += 2) 谈者{
if (num % i == 0) {
return false
}
}
return true
}
/**
* 在第二种方法上再次优化,利用数字的性质:<br>
* 一个数不是素数就是合数,那么一定可以由两个自然数相乘得到,其中一个大于或等于它的平方根,<br>
* 一个小于或等于它的平方根,并且成对出现。<br>
* 这样就可以把计算量大幅度减少
*/
public boolean isPrimeNum_3(int num) {
if (num == 2) {
return true// 2特殊处理
}
if (num < 2 || num % 2 == 0) {
return false// 识别小于2的数和偶数
}
double sqrt = Math.sqrt(num)
for (int i = 3 i <= sqrt i += 2) {
if (num % i == 0) {
return false
}
}
return true
}
/**
* Java中的BigInteger中已经写好了一个判断是否为质数的方法,直接用就可以了
*/
public boolean isPrimeNum_4(int num) {
BigInteger integer = BigInteger.valueOf(num)
return integer.isProbablePrime(1)
}
public static void main(String[] args) {
Test_04 test_04 = new Test_04()
int num = 991
System.out.println(test_04.isPrimeNum_1(num))
long startTime = System.currentTimeMillis()
for (int i = 0 i < 1000000 i++) {
test_04.isPrimeNum_1(num)
}
long endTime = System.currentTimeMillis()
System.out.println("第一种方法运行时间:" + (endTime - startTime) + "ms")
System.out.println(test_04.isPrimeNum_2(num))
startTime = System.currentTimeMillis()
for (int i = 0 i < 运绝1000000 i++) {
test_04.isPrimeNum_2(num)
}
endTime = System.currentTimeMillis()
System.out.println("第二种方法运行时间:" + (endTime - startTime) + "ms")
System.out.println(test_04.isPrimeNum_3(num))
startTime = System.currentTimeMillis()
for (int i = 0 i < 1000000 i++) {
test_04.isPrimeNum_3(num)
}
endTime = System.currentTimeMillis()
System.out.println("第三种方法运行时间:" + (endTime - startTime) + "ms")
System.out.println(test_04.isPrimeNum_4(num))
startTime = System.currentTimeMillis()
for (int i = 0 i < 1000000 i++) {
test_04.isPrimeNum_4(num)
}
endTime = System.currentTimeMillis()
System.out.println("第四种方法运行时间:" + (endTime - startTime) + "ms")
}
}
输出结果:
true第一种方法运行时间:2732ms
true
第二种方法运行时间:671ms
true
第三种方法运行时间:68ms
true
第四种方法运行时间:1064ms
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)