添加用户输入提供的 L1 和 L2 范围内的奇数和偶数

Addition of odd and even numbers from range of L1 and L2 provided by user input

我正在努力完成这项任务。 用户提供号码 L1 和 L2。将 L1、L2 范围内的所有奇数和该范围内的所有偶数相加并显示总和。我必须以 3 种方式实现它,使用:for、while 和 do while 循环。 我的 for 循环运行完美,但 while 显示了一些更高的分数。

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);
    }
}
 

根据您当前的方法,这里有一些观察结果。

  • 您只需要一台扫描仪。

  • 您正在测试 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 == 3OR 简单地设置低位使值变为奇数或让它保持奇数。
  • 类似地,对于任何值 ee|1 将是相同的奇数值或下一个最高值。

现在有足够的信息来计算 evenodd 之间的值之和 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 类型以避免溢出。