簡體   English   中英

計算兩個用戶輸入之間的奇數總和

[英]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();

我正在談論的公式如下,使用簡單的級數求和得出。

對於整數, startend

      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.

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