簡體   English   中英

為什么我的程序沒有給出預期的輸出?

[英]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^100Integer.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM