我正在使用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);
这段代码给了我一个错误的答案。这是为什么?我认为两者的含义相同。如果不是这样,有人可以解释一下原因吗?
答案 0 :(得分:3)
首先,
for (x=0; x<1000; x+=3){
x+=x;
}
for (x= 0;
您使用循环计算x
,然后使用x = 0
吹走该值,以便第一个循环不执行任何操作。
第二个sum
循环比第二个x
循环运行的次数多。
在sum
案例中,sum > 1000
在x > 1000
之前一段时间,但在x
案例中,一旦增量推送x
,循环就会终止超过1000。
你的首要问题是你没有分开顾虑:
使用两个变量x
和sum
,您可以将问题分解为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的每个倍数进行迭代。基本上,这段代码与你想要的东西根本不同,你应该坚持使用第一个代码。