Java程序陷入无限循环求助:字符串指定位置循环打印逻辑排查
Java程序无限循环问题排查与修复
问题根源分析
你的代码陷入无限循环主要有两个核心逻辑错误:
- N的倍数计算错误:你用
n+=n让当前n翻倍,这不是按初始N的倍数递增。比如初始n=2、字符串长度5时,n会变成4→3→1→2,从此进入循环,永远到不了5,触发无限循环。 - 循环终止条件不合理:
while(n!=l)的条件太苛刻,很多场景下n永远不会等于字符串长度l,导致循环无法终止。
另外,代码还遗漏了初始n等于l的场景,此时应该直接打印最后一个字符。
修正后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); int initialN = sc.nextInt(); // 保存初始的N值 int l = str.length(); int currentPos = initialN; // 当前要打印的位置(从1开始) // 用数组记录已打印的位置,避免重复循环(当N和l有公约数时会重复) boolean[] visited = new boolean[l]; while (!visited[currentPos - 1]) { visited[currentPos - 1] = true; System.out.print(str.charAt(currentPos - 1)); // 按初始N递增,超出长度则循环到开头 currentPos += initialN; if (currentPos > l) { currentPos -= l; } } } }
修正说明
- 保存初始的N值,每次递增都基于这个初始值,保证是N的倍数(循环遍历下的等效倍数)。
- 使用
visited数组记录已打印位置,避免当N和字符串长度l存在公约数时,出现重复循环无法终止的情况(比如l=4、N=2,位置2→4→2→4...)。 - 循环条件改为判断当前位置是否已访问过,确保所有符合要求的字符都打印一次后终止。
内容的提问来源于stack exchange,提问作者Nive
相关产品推荐
相关产品推荐

