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