Java抛硬币程序:实现正反面最大连续次数统计的逻辑咨询
抛硬币最大连续次数统计修正方案
原有代码的核心逻辑漏洞
- 未拆分计数变量的边界:把「所有正面总次数」「当前连续正面次数」「历史最长正面连续次数」三类完全独立的计数混为一谈,原代码中拿总正面数
heads做连续值判断,逻辑完全错位 - 连续计数逻辑缺失:仅设置了针对正面的连续变量
hc,完全没有为反面的连续过程设计对应的计数、最大值存储逻辑 - 连续值更新逻辑错误:原代码
if (heads>=hc) hc++的判断不成立,heads是累计所有抛中的正面总量,不是当前连续段的长度,累计到后面会出现计数完全失真的问题
正确的实现逻辑
需要基于三类计数目标拆分独立变量,分别完成总次数统计、当前连续段计数、历史最大值存储:
- 复用原有
heads/tails变量,继续存储正面、反面的累计总次数 - 新增两个当前连续段计数器:
currentHeadsStreak:记录当前正在连续抛出正面的次数,一旦抛出反面就立即清零currentTailsStreak:记录当前正在连续抛出反面的次数,一旦抛出正面就立即清零
- 新增两个历史最大值存储变量:
maxHeadsStreak:存储整个流程中出现过的最长连续正面长度,每次更新当前连续正面计数时,同步比对更新最大值maxTailsStreak:存储整个流程中出现过的最长连续反面长度,每次更新当前连续反面计数时,同步比对更新最大值
每一轮抛硬币的循环流程调整为:
- 抛出正面时:总正面数+1,当前连续正面数+1;将当前连续正面数和历史最大正面连续值比对,超出则更新最大值;将当前连续反面数清零
- 抛出反面时:总反面数+1,当前连续反面数+1;将当前连续反面数和历史最大反面连续值比对,超出则更新最大值;将当前连续正面数清零
修正后的完整代码
import java.util.*; class Main { public static void main(String[] args) { // 总次数统计,原有变量保留 int heads = 0, tails = 0; int usernum; // 新增连续计数、最大连续计数变量 int currentHeadsStreak = 0; int currentTailsStreak = 0; int maxHeadsStreak = 0; int maxTailsStreak = 0; Scanner scan = new Scanner(System.in); Coin myCoin = new Coin(); System.out.println("The number flips: "); usernum=scan.nextInt(); for (int count = 1; count <= usernum; count++) { myCoin.flip(); if (myCoin.isHeads()) { heads++; currentHeadsStreak++; // 更新最大正面连续值 if (currentHeadsStreak > maxHeadsStreak) { maxHeadsStreak = currentHeadsStreak; } // 切换到正面时,清零反面连续计数 currentTailsStreak = 0; System.out.println("Heads"); }else{ tails++; currentTailsStreak++; // 更新最大反面连续值 if (currentTailsStreak > maxTailsStreak) { maxTailsStreak = currentTailsStreak; } // 切换到反面时,清零正面连续计数 currentHeadsStreak = 0; System.out.println("Tails"); } } // 原有总次数输出保留,新增最大连续值输出 System.out.println("Total Heads: " + heads); System.out.println("Total Tails: " + tails); System.out.println("Max consecutive Heads: " + maxHeadsStreak); System.out.println("Max consecutive Tails: " + maxTailsStreak); } }
注:代码中原有
Coin类的实现无需修改,仅调整主循环内的计数逻辑即可正常运行。
内容的提问来源于stack exchange,提问作者johndoe123
相关产品推荐
相关产品推荐

