1

我必须编写一个程序,使用循环计算 a 和 b(包括)之间所有奇数的总和,其中 a 和 b 是输入。

我做了这个(如下),它工作正常,但我注意到它有一个问题:当我输入一个较大的数字,然后输入一个较小的数字时,它返回 0,但是当我首先输入较小的数字时,它工作得很好。对此有任何快速修复吗?:)

import java.util.Scanner;

public class ComputeSumAAndB
{

   public static void main (String[] args)
   {
       Scanner in = new Scanner(System.in); 
       System.out.print("Please enter 2 integers: "); //prompts user for ints
       int a = in.nextInt(); 
       int b = in.nextInt();
       int sum = 0;

       for (int j = a; j <= b; j++)
       {
           if (j % 2 == 1)
             sum += j;
       }
       System.out.println("The sum of all odd numbers (inclusive) between " + a + " and "+ b + " is " + sum);
   }
}
4

6 回答 6

3
int temp;
if(a > b) {
    temp = a;
    a = b;
    b = temp;
}

把它放在你的for循环开始之前。


if检查(输入的a第一个数字)是否大于b。如果是,它交换ab。现在您的for循环将始终从最小的数字开始并迭代到较大的数字(因为在此之后ifa将始终是较小的数字)。

使用此方法具有使您的输出有意义的附加副作用。你的输出现在总是说:"between [smaller number] and [larger number]".

rolfl 的答案更优雅,工作得很好,但是当用户首先输入更大的数字时,你的输出可能看起来有点奇怪:"between [larger number] and [smaller number]"等等。

于 2013-11-06T01:29:42.487 回答
2

您可以通过使用Math.min()Math.max函数来获得更小和更大的输入......

for (int j = Math.min(a,b); j <= Math.max(a,b); j++) {
    if (j % 2 == 1) {
        sum += j;
    }
}
于 2013-11-06T01:31:28.140 回答
0

它不起作用,因为Afor循环中大于B,你让它在A小于或等于B时迭代。

你可以按照 nhgrif 所说的去做,但它会改变你的数据。但他是正确的。

于 2013-11-06T01:31:20.073 回答
0

那是因为您首先期望a输入(下限),然后是b(上)。当您的程序到达 时,如果第一个输入较大,则条件为forFalse j = aa <= b换句话说,它永远不会进入for循环。

于 2013-11-06T01:32:57.833 回答
0

其实你应该做以下两件事:

1 就像上面提到的rolfl一样。您需要将最小值和最大值放在循环中的正确位置。

for (int j = Math.min(a,b); j <= Math.max(a,b); j++) {

if (j % 2 == 1) {
    sum += j;
}

}

2 使用if (j % 2 == 1)来检查 num 是否为奇数是不够的。

例如

a = -5 , b =0; 结果会怎样?

    int sum = 0;
    for(int j=-5;j<0;j++)
    {
        if(j%2 == 1)
        {
            sum+=j;
        }
    }

sum 的值为 0。

我们需要将条件更改为if(!(j%2 == 0))然后你会得到预期的结果。

于 2013-11-06T01:52:27.467 回答
0

那是因为您首先期望输入 a(下限),然后是 b(上限)。当您的程序到达 for, j = a 时,如果第一个输入较大,则条件 a <= b 为 False。换句话说,它永远不会进入 for 循环。

于 2013-11-06T02:07:21.970 回答