
本题核心在于理解“由各数个位拼成的新数能否被10整除”的数学本质——该数能被10整除当且仅当其个位为0,而拼接结果的个位恒等于数组中最后一个数的个位,因此无需构造大数,只需判断 A[N-1] % 10 == 0。
本题核心在于理解“由各数个位拼接成的数能否被10整除”的数学本质——该数能被10整除当且仅当其个位为0,而拼接结果的个位**恒等于数组中最后一个数的个位**,因此无需构造大数,只需判断 `a[n-1] % 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。
而拼接后的数(如 d₀d₁…dₙ₋₁)的个位,严格等于最后一个被拼接的数字 dₙ₋₁,即 A[N-1] % 10。
因此,整个拼接数是否被 10 整除,完全取决于 A[N-1] 的个位是否为 0 —— 与前面所有数字无关。
原代码的问题正源于忽视这一性质:
- 使用
double ans累加arr[i] * 10^j构造拼接数,存在浮点精度丢失(Math.pow(10, j)对大j不精确); - 强制转
int ans1后仍用ans % 10判断,但ans已是double,可能因精度误差导致错误; - 时间与空间复杂度无必要地升至 $ O(N) $,且易溢出(如 $ N > 18 $ 时
10^j超出double精确整数范围)。
✅ 正确解法极简高效:
import java.util.Scanner;
class TestClass {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
int[] A = new int[N];
for (int i = 0; i < N; i++) {
A[i] = s.nextInt();
}
// 只需检查最后一个数的个位是否为 0
if (A[N - 1] % 10 == 0) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}? 注意事项:
- 输入保证
N ≥ 1,故A[N-1]安全可访问; -
A[i]为非负整数,% 10恒返回0~9,无需额外处理负数; - 该解法时间复杂度 $ O(1) $(仅读取最后一个数即可提前判断),空间复杂度 $ O(1) $(甚至可不存整个数组)。
? 延伸思考:若题目改为“拼接数能否被 3 或 11 整除”,则需计算各位数字和或交错和——此时才真正需要遍历全部个位。但对因子 10(及 2、5、100 等含因子 2 和 5 的数),始终只需关注最低位或末几位。抓住数论特性,方能化繁为简。

















