Java黑皮书课后题第10章:*10.19(Mersenne素数)

题目

在这里插入图片描述

代码

import java.math.BigInteger;public class Test19 {public static void main(String[] args) {// 获取小于100的所有素数(int数组即可)int[] arr = new int[50];int count = 0;for (int i = 2 ; i < 100 ; i++){if (isPrimeNumber(i)){arr[count] = i;count++;}}int[] arr1 = new int[count];for (int i = 0 ; i < count ; i++){arr1[i] = arr[i];}arr = arr1;// 遍历数组获取Mersenne素数,输出、并放在BigInteger数组中System.out.println("p\t2^p-1");BigInteger[] bi_arr = new BigInteger[count];double temp = 0;for (int i = 0 ; i < count ; i++){temp = Math.pow(2, arr[i]) - 1;if (isPrimeNumber(temp)){BigInteger bit = new BigInteger(temp + "");bi_arr[i] = bit;System.out.printf("%d\t%d\n", arr[i], (int) temp);} else {bi_arr[i] = new BigInteger("-2");}}for (int i = 0 ; i < count ; i++){if (bi_arr[i].equals(new BigInteger("2"))){for (int a = i ; a < count ; a++){bi_arr[a] = bi_arr[a+1];}}}}public static boolean isPrimeNumber(double num){for (int i = 2 ; i < num ; i++){if (num % i == 0){return false;}}return true;}
}

问题

目前这一块还是有比较多的问题
书上明明可以使用基本数据类型+""以转字符
BigInteger类也没问题
但是在我电脑上(新配置了JDK16)出现了问题
这样的方法转字符串程序不认可
直接报错
无法运行

后续修改

21.9.22

把BigInteger类改为BigDecimal方法
这样就没报错,而且能运行了
但运行速度还是很慢

代码

import java.math.BigDecimal;public class Test19 {public static void main(String[] args) {// 获取小于100的所有素数(int数组即可)int[] arr = new int[50];int count = 0;for (int i = 2 ; i < 100 ; i++){if (isPrimeNumber(i)){arr[count] = i;count++;}}int[] arr1 = new int[count];for (int i = 0 ; i < count ; i++){arr1[i] = arr[i];}arr = arr1;// 遍历数组获取Mersenne素数,输出、并放在BigInteger数组中System.out.println("p\t2^p-1");BigDecimal[] bi_arr = new BigDecimal[count];double temp = 0;for (int i = 0 ; i < count ; i++){temp = Math.pow(2, arr[i]) - 1;if (isPrimeNumber(temp)){BigDecimal bit = new BigDecimal(temp + "");bi_arr[i] = bit;System.out.printf("%d\t%d\n", arr[i], (int) temp);} else {bi_arr[i] = new BigDecimal("-2");}}for (int i = 0 ; i < count ; i++){if (bi_arr[i].equals(new BigDecimal("2"))){for (int a = i ; a < count ; a++){bi_arr[a] = bi_arr[a+1];}}}}public static boolean isPrimeNumber(double num){for (int i = 2 ; i < num ; i++){if (num % i == 0){return false;}}return true;}
}

运行后不到一分钟后的结果(没运行完)

p	2^p-1
2	3
3	7
5	31
7	127
13	8191
17	131071
19	524287
31	2147483647


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部