Java黑皮书课后题第10章:*10.19(Mersenne素数)
生活随笔
收集整理的这篇文章主要介绍了
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总结
以上是生活随笔为你收集整理的Java黑皮书课后题第10章:*10.19(Mersenne素数)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Java黑皮书课后题第10章:*10.1
- 下一篇: Java黑皮书课后题第10章:*10.2