我正在為這項任務而苦苦掙扎。用戶提供數字 L1 和 L2。將 L1、L2 范圍內的所有奇數和該范圍內的所有偶數相加并顯示總和。我必須以 3 種方式實作它,使用:for、while 和 do while 回圈。我的 for 回圈作業得很好,但同時顯示了一些更高的分數。
import java.util.Scanner;
public class PPO4b {
public static void main(String[] args) {
Scanner value1Check = new Scanner(System.in);
System.out.println("Provide first value: ");
int value1 = value1Check.nextInt();
Scanner value2Check = new Scanner(System.in);
System.out.println("Provide second value: ");
int value2 = value2Check.nextInt();
int sumOdd = 0;
int sumEven = 0;
int i = 0;
while (i <= 0) {
if (i % 2 == 1) {
sumOdd = sumOdd i;
} else {
sumEven = sumEven i;
}
i = i 1;
}
System.out.println("Sum is equal to: " sumEven);
System.out.println("Sum is equal to: " sumOdd);
}
}
uj5u.com熱心網友回復:
根據您目前的方法,這里有一些觀察結果。
您只需要一臺掃描儀。
您正在測驗
i
應該測驗輸入范圍的奇偶校驗,
例如應該是這樣的:while (value1 <= value2) { if (value1 % 2 == 1) { sumOdd = sumOdd value1;
不要忘記增加
value1
列印時,不要只用 . 標記每個總和
sum
。使用描述性名稱
替代方法
只需一點數學,您就可以及時做到這一點O(1)
。
- 對于
1 thru n
值的總和,n(n 1)/2)
將給出總和 - 同樣對于
k thru n
值,(n-k 1)(n k)/2
將給出這些值的總和。 - 現在考慮一系列數字,例如
2 3 4 5 6
。偶數的總數3
是2, 4, and 6
。即使您擁有1 2 3 4 5 6 7
. - 對于任何偶數值
s
,下一個較低的是((s-1)
。所以如果s = 4
會3
- 對于任何奇數值
s
,下一個較低的數值是(s-1)|1
。所以對于s == 4
,(s-1) = 3 and 3|1 == 3
. 只需將OR
低位設定為奇數或讓它保持奇數。 - 類似地,對于任何值
e
,e|1
將是相同的奇數值或下一個最高值。
現在有足夠的資訊來計算和之間的值之even
和。odd
s and e
對于給定的 int e 和 int s;
int totalSum = ((e s)*(e-s 1))/2;
e = (e|1);
s = (s-1)|1;
int evenCount = (e-s)/2;
int sumEven = ((e - s 1) * (evenCount))/2;
int sumOdd = totalSum - sumEven;
這是驗證它的方法。
- 使用范圍中的一個計算偶數和奇數和
IntStream
,適當地過濾掉偶數和奇數 - 接下來使用上述方法計算相同的值。
- 比較相應的金額并報告任何差異。
Random rnd = new Random();
for (int i = 0; i < 200000; i ) {
int s = rnd.nextInt(200) 100;
int e = rnd.nextInt(500) s;
int compEven = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 0).sum();
int compOdd = IntStream.rangeClosed(s, e)
.filter(r -> r % 2 == 1).sum();
int totalSum = (e s) * (e - s 1) / 2;
e |= 1;
s = (s - 1) | 1;
int evenCount = (e - s 1) / 2;
int evenSum = ((e s) * evenCount) / 2;
int oddSum = totalSum - evenSum;
if (evenSum != compEven || oddSum != compOdd) {
System.out.println("Oops - sums don't match");
}
}
注意:根據范圍,您可能需要使用 long 或 BigInteger 型別以避免溢位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482198.html