[英]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^31
是int
可以存儲的“最大”數字。
如果您 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.