do-while循环条件语句问题:Buzz数字筛选代码未达预期
问题分析与修复:Buzz数字筛选程序
你的代码核心问题是用同一个变量counter承担了两个完全不同的职责:它既是初始数的偏移量(用来生成下一个要检查的数字),又是已找到的Buzz数字的计数。这会导致非Buzz数字出现时,counter不递增,循环会一直重复检查同一个数字,永远凑不够你要的Buzz数字数量。
修复方案
把两个职责拆分到不同变量:一个变量跟踪当前检查的数字,另一个变量统计已找到的Buzz数字数量。
修复后的代码:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] input = scanner.nextLine().split(" "); long currentNumber = Long.parseLong(input[0]); int targetCount = Integer.parseInt(input[1]); int buzzCount = 0; while (buzzCount < targetCount) { if (isBuzz(currentNumber)) { System.out.println(currentNumber + " is a Buzz number"); buzzCount++; } // 不管是不是Buzz数字,都检查下一个数 currentNumber++; } scanner.close(); } public static boolean isBuzz(long number) { boolean isDivisible = number % 7 == 0; boolean endsWith7 = number % 10 == 7; // 用取模代替字符串操作,更高效 return isDivisible || endsWith7; } }
关键改动说明
- 拆分变量职责:
currentNumber:从初始数开始,每次循环都递增,确保我们按顺序检查每一个数字buzzCount:只在找到Buzz数字时递增,直到达到用户指定的目标数量
- 优化
isBuzz方法:用number % 10 == 7代替字符串转换判断末位,性能更优且代码更简洁 - 修正类名:Java规范中类名首字母大写,把
main改成Main
原代码问题详解
原代码中,当遇到非Buzz数字时,counter不会递增,导致nextNumber永远是初始数 + 同一个counter,循环会无限重复检查这个非Buzz数字,永远无法满足counter < 目标数量的循环条件,自然得不到预期结果。
内容的提问来源于stack exchange,提问作者Ruzvelt
相关产品推荐
相关产品推荐

