计算两个用户输入之间的奇数和

我正在尝试计算两个用户输入的数字之间的奇数之和。

这是我到目前为止的代码:

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。

我在哪里出错了?

laohu1959 回答:计算两个用户输入之间的奇数和

您需要检查第一个数字是偶数还是奇数,因为如果是偶数,它将对偶数而不是奇数求和,因为在每次迭代之后您都将“ 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开始,然后得到7,9,11,...

,

sum a range of numbers

  

取第一个数字和最后一个数字的平均值,然后乘以数字。

但是,首先,您需要确保上下限是奇数。这实际上是问题代码的问题所在。

完成后,计算平均数数字数

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);  
    }
本文链接:https://www.f2er.com/3048370.html

大家都在问