我正在尝试制作一个程序,列出100-1000之间可被5或6整除的所有数字。这是我使用的代码:
public class divisibleBy5and6 {
public static void main (String[] args) {
j = 1;
int number = 100;
while (number < 1001) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
number++;
j++; }
if (j % 10 == 0 && j != 0) {
System.out.println();
j++; }
else {
number++;
}
}
我使用int j
来制作它,因此每行有9个。这是我的输出:
100, 102, 105, 108, 110, 114, 120, 125, 130,
132, 135, 138, 140, 144, 150, 155, 160, 162,
165, 168, 170, 174, 180, 185, 190, 192, 195,
198, 200, 204, 210, 215, 220, 222, 225, 228,
230, 234, 240, 245, 250, 252, 255, 258, 260,
264, 270, 275, 280, 282, 285, 288, 290, 294,
295, 300, 305, 310, 312, 315, 318, 320, 324,
325, 330, 335, 340, 342, 345, 348, 350, 354,
355, 360, 365, 370, 372, 375, 378, 380, 384,
385, 390, 395, 400, 402, 405, 408, 410, 414,
415, 420, 425, 430, 432, 435, 438, 440, 444,
445, 450, 455, 460, 462, 465, 468, 470, 474,
475, 480, 485, 490, 492, 495, 498, 500, 504,
505, 510, 515, 520, 522, 525, 528, 530, 534,
535, 540, 545, 550, 552, 555, 558, 560, 564,
565, 570, 575, 580, 582, 585, 588, 590, 594,
595, 600, 605, 610, 612, 615, 618, 620, 624,
625, 630, 635, 640, 642, 645, 648, 650, 654,
655, 660, 665, 670, 672, 675, 678, 680, 684,
685, 690, 695, 700, 702, 705, 708, 710, 714,
715, 720, 725, 730, 732, 735, 738, 740, 744,
745, 750, 755, 760, 762, 765, 768, 770, 774,
775, 780, 785, 790, 792, 795, 798, 800, 804,
805, 810, 815, 820, 822, 825, 828, 830, 834,
835, 840, 845, 850, 852, 855, 858, 860, 864,
865, 870, 875, 880, 882, 885, 888, 890, 894,
895, 900, 905, 910, 912, 915, 918, 920, 924,
925, 930, 935, 940, 942, 945, 948, 950, 954,
955, 960, 965, 970, 972, 975, 978, 980, 984,
985, 990, 995, 1000,
这显然是不对的,因为我遗漏了像115
这样的数字。我做错了什么?
答案 0 :(得分:5)
您需要从if / else语句中分隔数字增量。它应该在每次迭代时发生,无论是什么......
int j = 1;
int number = 100;
while (number < 1001) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
j++;
}
if (j % 10 == 0) {
System.out.println();
}
number++;
}
答案 1 :(得分:4)
问题在于,有时候,您会在每个循环中递增number
两次。第一次是数字是6
或5
的倍数,第二次是您不打印换行符。这具有跳过数字的效果,使得5
或6
的连续倍数不会打印,例如115
,因为它在{{1}之后并且被跳过了。另请注意,114
或5
的其他连续倍数不会打印,例如6
之后的126
。
明确指出,每个循环只增加125
一次,但从number
和number++;
块中删除if
,并通过放置else
无条件地增加在number++;
循环的最底部。
答案 2 :(得分:3)
在number++;
System.out.print(number + ", ");
的第一个位置
改变
else {
number++;
}
当您刚刚打印换行符时,它会执行此操作。
到
number++;
它将在每次循环迭代时执行此操作
number
应无条件递增
答案 3 :(得分:3)
试试这个:
public class DivisibleBy5and6 {
public static void main (String[] args) {
int j = 1;
for (int number = 100 ; number < 1001; number++) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
j++;
}
if (j % 10 == 0) {// j never equals 0
System.out.println();
j++;
}
}
}
}
BTW,对于明确的循环,最好使用for
而不是while
。 (使您的代码更具可读性)
如你所见,你不要以这种方式感到困惑,并在正确的地方增加number
。
答案 4 :(得分:1)
你有一个重复的number++
,当两个条件都为真时,它被执行了两次。
这超过了一些价值观:现在纠正了:
int j = 1;
int number = 100;
while (number < 1001) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
j++;
}
if (j % 10 == 0 && j != 0) {
System.out.println();
j++;
}
number++;
}
答案 5 :(得分:0)
您的问题是代码格式不正确。正确缩进它会变得更加清晰:
public class divisibleBy5and6 {
public static void main (String[] args) {
j = 1;
int number = 100;
while (number < 1001) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
number++;
j++;
}
if (j % 10 == 0 && j != 0) {
System.out.println();
j++;
}
else {
number++;
}
}
然后您可以看到else
附加到第二个if
,而不是第一个,因此number
的递增可以发生两次。
之后更清楚的是,在第一个if
内,number
仅在打印数字时递增。你真正想要的是number
每次迭代都会增加,而确保这一点的最佳方法是在}
的结束while
之前立即增加数字。
然后你会发现while(number < 1001) ... number++
循环可以用更健壮的for (int number 100; number < 1001; number++)
替换,完全消除了循环体中number
的递增。
在设计循环时,保持循环中哪些值“不变”(根本不变)非常重要,这些值在每次迭代时都会递增,并且会在更不规则的基础上进行修改。如果你保持这些概念,那么循环就不那么令人生畏了。
答案 6 :(得分:0)
public class pattern {
public static void main (String[] args) {
int j = 0;
int number = 100;
while (number < 1001) {
if (number % 6 == 0 || number % 5 == 0) {
System.out.print(number + ", ");
j++; }
if (j % 10 == 0&&(number % 6 == 0 || number % 5 == 0)) {
System.out.println();
number++;
}
else
{
number++;
}
}
}
}
试试这段代码。
您的代码中的错误是您实际上两次递增number
,这就是您错过某些数字的原因。
祝你好运:)