我刚刚开始学习Java,所以我的问题可能非常愚蠢。
我试图解决一个最简单的问题。
修改以前的程序,使其只有三个或五个的倍数 被视为总和,例如n = 17的3,5,6,9,10,12,15
这是我的代码:
import java.util.Scanner;
public class NewProblem {
public static void main (String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for (int i = 0; i < n; i++) {
if (i % 5 == 0 || i % 3 == 0) {
System.out.println(i);
}
else {
i++;
}
}
}
}
当我运行它时,它只显示三倍的倍数。例如,这是n = 17的输出:
0 3 6 9 10 15
所以它只是忽略了5的所有倍数。
出了什么问题? 如果问题真的很愚蠢,请再次抱歉。
答案 0 :(得分:3)
这里的问题是else
语句,它会将一个语句添加到&#34; i&#34;如果它不能被3
或5
分割。现在,让我们看看您的方法在n = 5
时的作用。首先,for循环以0
运行,5
和3
可分,因此for
循环再次运行,现在i = 1
。 1
或5
无法将3
整除,因此会调用else
语句,将1
添加到i
,但由于您已经设置for
循环来执行此操作,它会有效地将2
添加到i
,跳过i = 2
,并且您没有注意到,因为2
不应该首先打印出来。然后i = 3
,if
语句会像平常一样触发打印,for
循环再次触发,这次i = 4
。并且4
不能被3
或5
整除,因此else
语句会再次触发,有效地将2
添加到i
,因为{{1}循环添加一个和else语句一,导致for
,跳过i = 6
。这就是问题所在。由于i = 5
循环每次循环时都会向for
添加一个循环(i
语句的最后一部分显示for
),导致某些数字被跳过。只需删除i++
语句,您的代码就可以正常工作。
答案 1 :(得分:2)
你不需要在else块中增加i,它会在for循环的每次迭代中增加。