![](/img/trans.png)
[英]Find the sum of all odd numbers between a and b (inclusive), where both a and b are user inputs. My set_1 works but set_2 doesn't - Why?
[英]Calculating sum of odd numbers between two user inputs
我正在嘗試計算兩個用戶輸入數字之間的奇數總和。
這是我到目前為止的代碼:
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("#1: ");
int num1 = s.nextInt();
System.out.print("#2: ");
int num2 = s.nextInt();
int sum = 0;
for (int i = num1; i <= num2; i += 2) {
sum = sum + i;
}
System.out.print(sum);
}
}
當我輸入3和11時,它輸出35,這是正確的。
但是,對於 4 和 20,它輸出 108,這是不正確的。 它應該是 96。
我在代碼中哪里出錯了?
您需要先檢查第一個數字是偶數還是奇數,因為如果它是偶數,它將對偶數而不是奇數求和,因為每次迭代后都會將“i”增加 2。 嘗試在 for 循環之前添加以下行。
if(num1%2==0){num1++);
如果您從偶數開始,您的循環會對偶數求和。
檢查您的代碼:
for (int i = num1; i <= num2; i += 2)
假設num1
是偶數,例如4
。 然后你的循環從i = 4
開始。 然后你繼續+= 2
,所以你最終得到6, 8, 10, ...
,即偶數。
您可以通過在循環之前修補num1
來簡單地修復它。
// Put this before your loop
if (num1 % 2 == 0) { // checks if num1 is even
num1++;
}
這樣你將從5
then 開始,然后得到7, 9, 11, ...
。
對一系列數字求和:
取第一個數字和最后一個數字的平均值,然后乘以數字的個數。
但是,首先您需要確保下限和上限是奇數。 這實際上是問題中的代碼有什么問題。
完成后,計算平均數和數的數量:
public static long sumOddNumbers(int min, int max) {
long minOdd = (min % 2 == 1 ? min : min + 1); // Round up to odd number
long maxOdd = (max % 2 == 1 ? max : max - 1); // Round down to odd number
if (minOdd > maxOdd)
return 0;
// average = (minOdd + maxOdd) / 2
// count = (maxOdd - minOdd) / 2 + 1
// sum = count * average
return ((maxOdd - minOdd) / 2 + 1) * (minOdd + maxOdd) / 2;
}
測試
System.out.println(sumOddNumbers(3, 11)); // prints: 35
System.out.println(sumOddNumbers(4, 20)); // prints: 96
這可以通過數學公式輕松完成。 但是根據您的問題,我認為您想使用循環,所以這里是。
奇數的低位設置為 1。
如果數字已經是奇數,則重置該位無效,因此它仍然是奇數。
但是將該位設置為偶數會使其成為下一個更高的奇數。
所以使用按位或運算符。
3 | 1 = 3
4 | 1 = 5
並執行以下操作:
int start = 4;
int end = 20;
int sum = 0;
for (int i = (start | 1); i <= end; i += 2) {
sum += i;
}
System.out.println(sum);
如果你想在 Java 8+ 中使用流,你可以這樣做。
int sum = IntStream.rangeClosed(start, end).filter(i -> i & 1 == 1).sum();
我正在談論的公式如下,使用簡單的級數求和得出。
對於整數, start
和end
start |= 1; // ensure start is next odd number
end = (end | 1) - 2;// ensure end is last odd - 2
int sum = ((start + end) * ((end - start) / 2 + 1)) / 2;
如果兩個數都是自然數,則可以應用公式:
Sum of odd natural numbers from m to n = sum of natural odd numbers up to n - sum of natural odd numbers up to m
= (n/2)^2 - (m/2)^2
where n is an even number or the next even number in case it is an odd number
在節目中:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("#1: ");
int num1 = Math.abs(s.nextInt());
System.out.print("#2: ");
int num2 = Math.abs(s.nextInt());
System.out.println("Sum of natural odd numbers from "+num1+" to "+num2+" = "+sumNaturalOddOfRange(num1,num2));
num1 = 5;
num2 = 15;
System.out.println("Sum of natural odd numbers from "+num1+" to "+num2+" = "+sumNaturalOddOfRange(num1,num2));
num1 = 5;
num2 = 16;
System.out.println("Sum of natural odd numbers from "+num1+" to "+num2+" = "+sumNaturalOddOfRange(num1,num2));
num1 = 6;
num2 = 15;
System.out.println("Sum of natural odd numbers from "+num1+" to "+num2+" = "+sumNaturalOddOfRange(num1,num2));
}
static int sumNaturalOddOfRange(int num1, int num2) {
if(num2%2==1)
num2++;
return (int)(Math.pow(num2 / 2, 2) - Math.pow(num1 / 2, 2));
}
}
示例運行:
#1: 10
#2: 20
Sum of natural odd numbers from 10 to 20 = 75
Sum of natural odd numbers from 5 to 15 = 60
Sum of natural odd numbers from 5 to 16 = 60
Sum of natural odd numbers from 6 to 15 = 55
**Here is the answer**
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("#1: ");
int num1 = s.nextInt();
System.out.print("#2: ");
int num2 = s.nextInt();
int sum = 0;
if (num1%2==0) {
num1++;
}
for (int i = num1; i <= num2; i++) {
sum +=i;
}
System.out.print(sum);
}
只需如下更改您的for循環
for (int i = num1; i <= num2;) {
if(i%2==0)
i++;
else{
sum = sum + i;
i += 2;
}
}
上面的代碼將檢查i的值,如果它在第一次迭代中是偶數,則將其增加1,否則將其值相加並加2。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.