Java &引用;总和+=x";及;x+=x";给出不同的结果
我在参与Euler#1项目,以下是我的工作代码: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;
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)