“sum + = x”和“x + = x”给出不同的结果

时间:2014-06-13 17:43:28

标签: java

我正在使用Project Euler#1,这是我的工作代码:

public static void main(String[] args) {
    int sum = 0;

    for (int x = 0; x < 1000; x = x + 3) {
        sum += x;
    }

    for (int x = 0; x < 1000; x = x + 5) {
        if (x % 3 != 0) {
            sum += x;
        }
    }

    System.out.println(sum);

要清楚,这给了我正确的答案。但是,之前我运行过这段代码:

public static void main(String[] args) {
    int x = 0;

    for (x = 0; x < 1000; x += 3) {
        x += x;
    }

    for (x = 0; x < 1000; x += 5) {
        if (x % 3 != 0) {
            x += x;
        }
    }

    System.out.println(x);

这段代码给了我一个错误的答案。这是为什么?我认为两者的含义相同。如果不是这样,有人可以解释一下原因吗?

4 个答案:

答案 0 :(得分:3)

第一次循环出现问题

首先,

    for (x=0; x<1000; x+=3){
        x+=x;
    }
    for (x= 0;

您使用循环计算x,然后使用x = 0吹走该值,以便第一个循环不执行任何操作。

第二次循环出现问题

第二个sum循环比第二个x循环运行的次数多。

sum案例中,sum > 1000x > 1000之前一段时间,但在x案例中,一旦增量推送x,循环就会终止超过1000。

总体问题

你的首要问题是你没有分开顾虑:

  1. 如何将问题分解成碎片
  2. 如何将这些部分组合成一个解决方案
  3. 使用两个变量xsum,您可以将问题分解为x,然后将它们相加以得到答案。

    当你尝试使用一个变量时,你必须立即解决这两个问题,这个问题要难以纠正,而且难以调试。

答案 1 :(得分:1)

你真的有意改变:

sum += x;

成:

x += x;

这计算了一些相当不同的东西,修改为循环变量,应该可以改回来。

答案 2 :(得分:0)

您的虚假代码会将x添加到x >= 1000,然后再次将其设置为0并再次添加其他内容,直到x >= 1000,您不打算这样做。
您希望1到1000之间的数字之和可以被3和5整除,并且在总和大于或等于1000之前不要加上数字。

答案 3 :(得分:0)

我不确定你的代码应该做什么,但是既然你说第一个代码给出了正确的结果,我会假设你要打印1000的倍数为3的倍数的总和或者5。

第一个代码的作用非常简单:你创建一个变量来包含你的总和,你将它的值设置为零,然后通过迭代它们在总和中添加所有3的倍数,然后你再次使用多个5。

在此代码中, sum 是存储和的变量, x 在每个循环中都是一个临时变量,允许您迭代倍数。

在第二个代码中,您重命名 sum 以将其命名为 x ,这意味着当您使用 x 存储您的总和时,也正在使用它来循环遍历循环,包括更改其值( x = 0 x + = 3 x + = 5 ),并使用所述值来了解是否应继续进行下一次迭代( x <1000 )。除此之外,这意味着你不会为3或5的每个倍数进行迭代。基本上,这段代码与你想要的东西根本不同,你应该坚持使用第一个代码。