当处理大数构造(如“100...001”)时,直接用 `math.pow` 计算并转为整数输出会导致溢出或精度丢失,而逐字符打印字符串则稳定可靠。
在 CodeChef 题目 ZOOZ 中,要求对每个测试用例输出一个长度为 n 的二进制风格字符串:首位和末位为 '1',中间全为 '0'(例如 n=4 → "1001",n=3 → "101")。表面看,以下两种实现似乎等价:
✅ CODE 1(正确)—— 字符串拼接式输出
int t = in.nextInt();
while ((t--) > 0) {
int n = in.nextInt();
for (int j = 0; j < n; j++) {
if (j == 0 || j == n - 1)
System.out.print("1");
else
System.out.print("0");
}
System.out.println(); // 推荐用 println 替代 print("\n"),更清晰
}❌ CODE 2(错误)—— 数值计算式输出
int t = in.nextInt();
while ((t--) > 0) {
int n = in.nextInt();
System.out.println((int) Math.pow(10, n - 1) + 1);
}问题根源不在逻辑,而在数据类型与规模限制:
0¹⁵ 的整数无法精确表示。例如 Math.pow(10, 17) 在 Java 中可能返回 999999999999999999 或 1000000000000000000(取决于舍入),导致最终结果错误;✅ 正确实践原则:
StringBuilder sb = new StringBuilder().append('1');
for (int i = 0; i < n - 2; i++) sb.append('0');
if (n > 1) sb.append('1');
System.out.println(sb.toString());⚠️ 额外注意:
总结:算法题中,“输出看起来一样”不等于“行为完全等价”。务必区分语义输出与格式/精度/边界鲁棒性——尤其在涉及大数、浮点运算或字符串构造时,选择符合问题本质的数据抽象方式,才是 AC 的关键。