我有一個作業要使用 java 中的函式來獲取一組 3 個數字中的最大數字,這就是我想出的:
public static int max(int b, int a ,int d) {
int o =0;
while (b!=0 && a!=0 && d!=0)
{
b ;
a ;
d ;
o--;
}
return o;
}
問題是,如果給它 3 個數字,它將起作用,但我不明白它是如何作業的。
uj5u.com熱心網友回復:
好了,所以它在做什么增加三個變數b,a和d,直到其中的任何等于零。它記錄o回圈次數(即任何變數達到零所需的迭代次數),負數除外。
如果b, a, 和d是負數,那么它們會0相對較快地接近,并且o會出現負數 - 但這不是正在發生的事情,是嗎?你正在輸入正數,并得到一個積極的結果。
那是因為這個解決方案依賴于integer overflow。當b, a, 或d達到整數最大值 2147483647 時,它回傳到 -2147483648,并繼續向零計數。同時,o在相反的方向做同樣的事情,包裹另一個方向。數學的作品出來,使得當b,a或者d達到零,然后o到達的精確值b,a或d在啟動。
(對于負數,收斂發生得更快 - 但是如果您將負數和正數都放入此函式中,您可能會感到震驚。它會告訴您負數大于正數! )
現在您了解了它的作業原理,您也明白了為什么這是一個糟糕的解決方案。為了得到結果,它會運行很長很長的時間(除非輸入是負數,在這種情況下它只會運行比需要的更長的時間)。
更合理的常識實作如下所示:
public static int max(int b, int a ,int d) {
if (a >= b && a >= d) {
return a;
} else if (b >= a && b >= d) {
return b;
} else {
return d;
}
}
這incorpoates最多4個操作,無論是大企業a,b或者d是。
uj5u.com熱心網友回復:
假設b,a和d整數為正數,while 回圈理論上將永遠運行或實際上運行,直到您遇到錯誤。Returningo什么都不做,它只是一個非常小的負數,它不會告訴您這三個數字中哪一個是大數,只會告訴您在程式失敗之前執行了多少次迭代。
最好將它們添加到某個陣列中,對它們進行排序并回傳最高值。你甚至可以為 N 個數字做這件事,而不僅僅是三個。
private static int max(int... numbers){
return Collections.max(Arrays.asList(numbers));
}
哪里從輸入中Arrays.asList(numbers)產生一個List,并Collections::max會在串列中找到最大的數字。
所以你可以打電話max(3, 4, 5, 6, 7, 8, 8, 9)或max(1, 2)
或者,如果您需要在沒有任何庫的情況下執行此操作,即使它們是本機的,也只需使用一組if陳述句。
public static int max(int a, int b, int c) {
if (a >= b && a >= c) {
return a;
} else if (b >= a && b >= c) {
return b;
} else {
return c;
}
}
但這比使用先前的解決方案更難閱讀和理解,該解決方案清楚地告訴您發生了什么,而無需考慮三重if陳述。
還假設輸入引數是int b, int a ,int d,拼寫出
壞的
我敢打賭,這不是你的答案,而是一個你應該修復的不去做的例子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/358009.html
上一篇:如何使用條件將字串轉換為字典?
下一篇:驗證和計算BMI
