Java &引用;总和+=x";及;x+=x";给出不同的结果

Java &引用;总和+=x";及;x+=x";给出不同的结果,java,Java,我在参与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;

我在参与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);
publicstaticvoidmain(字符串[]args){
整数和=0;
对于(整数x=0;x<1000;x=x+3){
总和+=x;
}
对于(整数x=0;x<1000;x=x+5){
如果(x%3!=0){
总和+=x;
}
}
系统输出打印项数(总和);
为了清楚起见,这给了我正确的答案。但是,之前我运行了以下代码:

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);
publicstaticvoidmain(字符串[]args){
int x=0;
对于(x=0;x<1000;x+=3){
x+=x;
}
对于(x=0;x<1000;x+=5){
如果(x%3!=0){
x+=x;
}
}
系统输出println(x);

这段代码给了我一个不正确的答案。为什么?我认为这两个词的意思是相同的。如果不是这样,有人能解释一下原因吗?

你的假代码将添加
x
,直到
x>=1000
,然后再次将其设置为0,并再次添加其他内容,直到
x>=1000
,这是你不想做的。
你将1到1000之间的数字之和除以3和5,直到总和大于或等于1000时才将数字相加。

您真的想更改:

sum += x;
进入:

这会计算一些完全不同的内容,修改为循环变量,可能应该更改回。

第一个循环的问题 首先,

    for (x=0; x<1000; x+=3){
        x+=x;
    }
    for (x= 0;
for(x=0;x 1000
x>1000
之前的一段时间,但是在
x
的情况下,只要增量推动
x
超过1000,循环就会终止

首要问题 您的首要问题是您没有将关注点分开:

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


    当您尝试使用一个变量时,您必须同时对这两个问题进行推理,这两个问题更难纠正,也更难调试。

    这两个代码不能给出与您在所有代码中使用x相同的结果。事实上,在第一个循环结束之前,结果都是相同的,但在第二个循环开始时,您可以将x设置为0

     for (x= 0; x<1000; x+=5)
    

    for(x=0;x我不确定你的代码应该做什么,但是既然你说第一个代码给出了正确的结果,我就假设你想打印1000以下的所有整数的总和,它们是3或5的倍数

    第一段代码的作用非常简单:创建一个包含和的变量,将其值设置为零,然后通过迭代将和中的所有3的倍数相加,然后使用5的倍数再次执行

    在这段代码中,sum是存储sum的变量,x在每个循环中都是一个临时变量,允许您对倍数进行迭代


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

    定义“错误答案”在第二个示例中,您在循环体中递增x而不是sum,因此循环的迭代次数不会像第一个示例中那样多。我建议您使用调试器或add cout语句查看第二个示例中的x值。第二个循环中的
    x=0
    会丢弃第一个循环中完成的所有工作。您正在影响第二个示例中的迭代器计数器。我不明白为什么会有这么多的反对票。对于初学者来说,这是一个很好且重要的问题。
     for (x= 0; x<1000; x+=5)