
只需检查数组最后一个数的个位是否为0——因为一个整数能被10整除当且仅当其末位是0,而题目中“由各数末位拼成的新数”的末位恒等于数组最后一个数的末位。
只需检查数组最后一个数的个位是否为0——因为一个整数能被10整除当且仅当其末位是0,而题目中“由各数末位拼成的新数”的末位恒等于数组最后一个数的末位。
在本题中,给定长度为 $ N $ 的非负整数数组 A,要求判断:将每个元素的个位数字(即 A[i] % 10)按顺序拼接形成的十进制整数,是否能被 10 整除?
例如:
- 输入
A = [12, 34, 56]→ 各数个位为[2, 4, 6]→ 拼成数字246→246 % 10 != 0→ 输出"No" - 输入
A = [7, 8, 90]→ 个位为[7, 8, 0]→ 拼成780→780 % 10 == 0→ 输出"Yes"
⚠️ 关键洞察:
一个十进制整数能被 10 整除 ⇔ 其个位数字为 0。
而拼接后数字的个位,完全由数组中最后一个数的个位决定(因为拼接是顺序进行的,如 [a,b,c] → abc,c 是最终结果的个位)。
因此,无需真正构造大数(可能溢出或精度丢失),更无需遍历、幂运算或浮点计算。
原代码存在多个严重问题:
- 使用
double ans累加Math.pow(10, j)导致浮点精度误差(如Math.pow(10, 15)在 double 中不精确),造成ans % 10判断失准; -
int ans1 = (int) ans强转会截断小数,但ans本身已因浮点误差不可靠; - 时间/空间复杂度冗余:$ O(N) $ 构造数组 + $ O(N) $ 幂运算,实际只需 $ O(1) $。
✅ 正确且最优解法(Java):
import java.util.Scanner;
class TestClass {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
if (N <= 0) {
System.out.println("No");
return;
}
// 读取前 N-1 个数(可跳过,仅需最后一个)
for (int i = 0; i < N - 1; i++) {
s.nextInt();
}
int lastNum = s.nextInt();
int lastDigit = lastNum % 10;
if (lastDigit == 0) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}? 进阶优化说明:
- 甚至无需存储整个数组,只保留最后一个数即可;
- 边界处理:若
N == 0,无数字可拼,逻辑上视为 0(但题目限定非负整数且N应 ≥ 1,保险起见仍做校验); -
lastNum % 10始终返回[0,9]范围内的个位,安全可靠。
总结:本题本质是考察对「整除10的充要条件」的理解与简化建模能力。避免陷入“必须构造完整数字”的思维定式,善用数学性质,才能写出健壮、高效、零精度风险的代码。

















