[英]Why is my program not giving the expected output?
我正在研究Euler項目的問題29,其中指出:
考慮a ^ b的所有整數組合,2≤a≤5且2≤b≤5:
2 ^ 2 = 4,2 ^ 3 = 8,2 ^ 4 = 16,2 ^ 5 = 32
3 ^ 2 = 9,3 ^ 3 = 27,3 ^ 4 = 81,3 ^ 5 = 243
4 ^ 2 = 16,4 ^ 3 = 64,4 ^ 4 = 256,4 ^ 5 = 1024
5 ^ 2 = 25,5 ^ 3 = 125,5 ^ 4 = 625,5 ^ 5 = 3125
如果它們按數字順序放置,刪除任何重復,我們得到以下15個不同術語的序列:
4,8,9,16,25,27,32,64,81,125,243,256,625,1024,3125
ab為2≤a≤100和2≤b≤100產生的序列中有多少個不同的項?
我已經編寫了用Java解決這個問題的程序。 它運行時沒有任何錯誤,但是沒有給出預期的輸出。 我在下面提供了我的代碼和輸出。
import java.util.ArrayList;
import java.math.BigInteger;
public class problemTwentyNine {
public static void main(String [] args) {
long start = System.nanoTime();
ArrayList<BigInteger> distinctTerms = new ArrayList<BigInteger>();
BigInteger temp;
for(int i = 2; i <= 100; i++) {
for(int j = 2; j <= 100; j++) {
temp = new BigInteger("" + (int) (Math.pow(i, j)));
if(!distinctTerms.contains(temp)) {
distinctTerms.add(temp);
}
}
}
System.out.println(distinctTerms.size());
long stop = System.nanoTime();
System.out.println("Execution time: " + ((stop - start) / 1e+6) + "ms");
}
}
輸出:
422
執行時間:24.827827ms
在項目euler上輸入這個答案后,我們可以看到它是不正確的; 但我無法看到我的代碼出錯了。
line (int) (Math.pow(i, j))
沒有多大意義,因為100^100
比Integer.MAX_VALUE
大得多。 你應該使用BigInteger
來做功能。
它應該是
temp = BigInteger.valueOf(i).pow(j);
你只得到422個不同元素的原因是你的值太大而你正在將它們轉換為int
。
當Math.pow(i, j)
(一個double
)的結果大於Integer.MAX_VALUE
並且轉換為int
,結果為Integer.MAX_VALUE
。
JLS的5.1.3節涵蓋了這種縮小的原始轉換 :
否則,以下兩種情況之一必須為真:
該值必須太小(大幅度或負無窮大的負值),第一步的結果是int或long類型的最小可表示值。
該值必須太大(大幅度或正無窮大的正值),第一步的結果是int或long 類型的最大可表示值 。
(強調我的)
你得到的結果很多,所以只有422個不同的結果。
將您的計算更改為BigInteger
數學。
temp = new BigInteger("" + i).pow(j);
隨着這一變化,我現在獲得了9,183個不同的元素。 這更有意義,因為一些完美正方形的力量將被重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.