Java布尔数组作业求助:邮箱翻转实验程序调试
邮递员翻转邮箱问题调试方案
作业要求:模拟邮递员“翻转邮箱”实验,100个编号1-100的邮箱初始全关闭,按以下规则操作:
- 第1步:翻转所有邮箱
- 第2步:翻转所有编号为2的倍数的邮箱
- 第3步:翻转所有编号为3的倍数的邮箱
- ...
- 第100步:仅翻转第100号邮箱
最终输出所有处于打开状态的邮箱编号
你的代码核心错误
- 死循环+数组越界:
for(int count = 0; count <= Mail.length; count = count++)存在两个致命问题:count = count++会导致count值永远不变,陷入死循环;count <= Mail.length会让count达到100,访问Mail[100](数组索引仅0-99)直接触发越界。 - 索引对应错误:邮箱编号是1-100,但数组索引是0-99,你直接用邮箱编号当索引,导致操作的是错误的邮箱(比如要操作邮箱2,应该用索引1)。
- 翻转逻辑错误:内层循环
count3 = count3 + 3固定加3,不管外层步骤数count2,完全不符合“翻转当前步骤数倍数邮箱”的要求。 - 赋值代替比较:多处用
=(赋值运算符)代替==(比较运算符),比如if(Mail[count3] = false),这会直接修改数组值,而非判断状态。 - 输出逻辑颠倒:你判断的是邮箱关闭状态并输出,且
print++会跳过部分邮箱,循环条件还存在越界问题。
修正后的代码
import java.util.Arrays; public class MailManProblem { public static void main(String[] args) { // 数组索引0对应邮箱1,索引99对应邮箱100,初始全关闭(false表示关闭) boolean[] mailboxes = new boolean[100]; Arrays.fill(mailboxes, false); // 模拟1到100步的翻转操作 for (int step = 1; step <= 100; step++) { // 翻转当前step倍数的邮箱:从step开始,每次加step for (int mailboxNum = step; mailboxNum <= 100; mailboxNum += step) { // 转换为数组索引:邮箱编号-1 int index = mailboxNum - 1; // 翻转状态:取反 mailboxes[index] = !mailboxes[index]; } } // 输出所有打开状态的邮箱(true表示打开) System.out.println("打开的邮箱编号:"); for (int i = 0; i < mailboxes.length; i++) { if (mailboxes[i]) { // 数组索引+1得到邮箱编号 System.out.println(i + 1); } } } }
代码说明
- 索引对应:用
邮箱编号-1对应数组索引,解决编号与索引不匹配的问题。 - 翻转逻辑:外层循环控制步骤数,内层循环遍历当前步骤数的所有倍数,用
!mailboxes[index]直接翻转状态,简化代码。 - 输出逻辑:仅判断
mailboxes[i]为true(打开)的情况,输出对应的邮箱编号(索引+1)。 - 冗余代码移除:去掉重复初始化数组的循环,用
Arrays.fill一次性完成初始化。
内容的提问来源于stack exchange,提问作者M_DS
相关产品推荐
相关产品推荐

