簡體   English   中英

我的代碼對於兩個特定的輸入測試都失敗了。 “無溢出”和“大整數溢出”

[英]My code is failing for two specific input tests. "No overflow" and "Big integers overflow"

第 1 部分給定 4 個整數,output 它們的乘積及其平均值,使用 integer 算法。

例如:如果輸入是:

8 10 5 4 output 是:

1600 6 注:Integer 除法舍棄小數。 因此 8 10 5 4 的平均值是 output 作為 6,而不是 6.75。

注意:測試用例包括四個非常大的輸入值,其乘積導致溢出。 您無需執行任何特殊操作,只需觀察 output 並不代表正確的產品(事實上,四個正數產生一個負數 output;哇)。

在您完成下面的第 2 部分之前,您的程序將無法通過最后的測試用例(這是預期的)。 保留這些陳述,但也添加第 2 部分的陳述。

第 2 部分也是 output 的乘積和平均值,使用浮點運算。

Output 每個小數點后三位的浮點數,實現方式如下: System.out.printf("%.3f", yourValue);

例如:如果輸入是 8 10 5 4,則 output 是:

1600 6 1600.000 6.750 請注意,分數不會被丟棄,並且對於具有大值的測試用例不會發生溢出。

import java.util.Scanner;

public class ProgrammingAssignment1 {
   public static void main(String[] args) {

      Scanner scnr = new Scanner(System.in);


    int int1;
    int int2;
    int int3;
    int int4;

    int1 = scnr.nextInt();
    int2 = scnr.nextInt();
    int3 = scnr.nextInt();
    int4 = scnr.nextInt();

//pt 1
    double product = ((double) int1) * int2 * int3 * int4;
    double average =  (int1+int2+int3+int4)/4.0;

//pt 2
        int result1 = (int) average;
        int result2 = (int) product;

        System.out.printf("%d %d\n",result2,result1);
        System.out.printf("%.3f %.3f\n",product,average);
    }
}

這是我的代碼。 這些測試特別失敗。 否則它運行良好。 Output 不同。 請參閱下面的要點。 Input 100000 200000 300000 500000 Your output 2147483647 275000 3000000000000000000000.000 275000.000 Expected output -1679818752 275000 3000000000000000000000.000 275000.000

Output 不同。 請參閱下面的要點。 特殊字符圖例 輸入 100000 200000 300000 500000 你的 output 以 2147483647 275000 300000000000000000000.000 275000.000 預期 88343710633165028 以-1757062165028 開頭

我試過操縱變量類型。 但沒有運氣

您不是在使用 integer 算術,而是在進行double算術。

存儲在計算機中的任何數字的問題在於,除非您注冊讓它使用的 memory 可能會增長到無限大小(而且我們還沒有發明具有無限 memory 的計算機,所以這是一個問題),你是不得不將它們存儲在固定的“大小”中。 int是 32 位, double是 64 位。 無論如何,32 位的數據最多只能存儲 2 的 32 次方不同的值。 雙精度數,假設它們是 64 位的,最多可以存儲2^64不同的唯一值。 出於同樣的原因 1 加 1 是 2 - 基本的數學性質。

對於 int/long,選擇的值都是“接近 0”的整數,即正數2^31-1和負數-2^31int可以存儲的“最大”數字。

如果您 go “越過”邊緣,數字會環繞。 這就是int / long在您嘗試進行需要比您更多的位的數學運算時“解決”問題的方式。

相反,對於double ,數字行上的某些特定數字被“祝福”以表示,並且任何其他結果都四舍五入到最接近的祝福數字。 當您遠離 0(即越來越大的數字)時,有福數字越來越少。 大約 2^52,任意 2 個有福數字之間的距離大於 1,甚至。 這確實意味着double可以表示非常非常大的數字 只是,有很多錯誤(正如我所說,雙重數學默默地四舍五入到最接近的祝福數字。如果任何 2 個祝福數字之間的差距很大,而且它們是大數字,所有四舍五入加起來會產生很多錯誤) . 這就是當你 go 超出它的位合理讓你做的事情時double解決問題的方式:大量的舍入,如果你 go 足夠遠,你最終會得到一個稱為NaN的數字(不是數字)。

因此,對於double ,結果隨着錯誤級別的增加而關閉,甚至是NaN 它永遠不會“溢出”(翻轉到數字線的另一端)。

你在做雙重數學,因此你為什么沒有看到“溢出”的數學錯誤。 您正在觀察舍入版本。

按照練習的要求使用所有積分數學。 要獲得平均值:

int product = int1 * int2 * int3 * int4;
int average =  (int1+int2+int3+int4)/4;

是的,平均值現在是“錯誤的”,但問題明確表明這是期望的結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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