为何图案代码在CodeNinjas平台换行异常?与其他平台表现不符
图案输出异常问题排查
问题情况
正在学习图案逻辑,编写的图案输出代码在部分在线编译器运行正常,但在CodeNinjas平台和C++中实现相同逻辑时,输出图案与预期不符(目标图案及实际输出见附图)。
问题代码(Java)
public static void numberCrown(int n) { // Write your code here. int n1=2*(n-1); for(int i=1;i<=n;i++){ for (int j = 1; j <= i; j++) { System.out.print(j+""); } for(int j=1;j<=n1;j++){ System.out.print(" "); } for (int j =i; j>=1; j--) { System.out.print(j+""); } System.out.println(""); n1=n1-2; } }
异常原因
核心问题出在字符宽度的一致性上:
- 原代码默认每个数字占1个字符位,当
n≥10时,数字会变成两位数(比如i=10时,数字10占2个字符位),导致左右两侧的数字序列长度超出预期,而中间空格数的计算仍基于“每个数字占1位”的逻辑,破坏了每行的总长度一致性,最终造成图案错位。 - CodeNinjas平台和C++的输出环境对字符长度的渲染更严格,没有自动适配这种长度变化;而其他编译器要么测试的
n都是一位数,要么渲染逻辑做了兼容,所以表现正常。
修复方案
确保每个输出单元(数字或空格)的宽度统一,以Java为例,使用格式化输出让每个数字固定占2个字符位,同时调整中间空格数的计算逻辑:
public static void numberCrown(int n) { for(int i=1;i<=n;i++){ // 格式化打印左侧递增数字,每个占2位 for (int j = 1; j <= i; j++) { System.out.printf("%2d", j); } // 计算中间空格数:保证每行总长度与最后一行一致 int spaces = 4 * (n - i); for(int j=1;j<=spaces;j++){ System.out.print(" "); } // 格式化打印右侧递减数字,每个占2位 for (int j =i; j>=1; j--) { System.out.printf("%2d", j); } System.out.println(); } }
如果目标图案要求数字占1位,则仅适用于n≤9的场景,当n≥10时需要重新设计逻辑,避免两位数破坏图案结构。
内容的提问来源于stack exchange,提问作者Madhan Mohan
相关产品推荐
相关产品推荐

