
给定一个非负整数数组,需判断“由各元素个位数字依次拼接而成的新数”是否能被10整除;关键在于:该数能被10整除 ⇔ 其个位为0 ⇔ 数组中最后一个元素的个位数字为0(即该元素本身能被10整除)。无需构造大数,避免溢出与逻辑错误。
给定一个非负整数数组,需判断“由各元素个位数字依次拼接而成的新数”是否能被10整除;关键在于:该数能被10整除 ⇔ 其个位为0 ⇔ 数组中最后一个元素的个位数字为0(即该元素本身能被10整除)。无需构造大数,避免溢出与逻辑错误。
在原题中,用户试图通过 data[i] % 10 提取每个数的个位,再用 Math.pow(10, j) 拼接成完整整数(如 [12, 34, 56] → 246),最后判断该数是否 % 10 == 0。这种思路存在多个严重问题:
✅ 根本性逻辑错误:
拼接规则是“按数组顺序取个位”,例如数组 [17, 23, 50] → 个位序列为 [7, 3, 0] → 拼接得 730。而 730 % 10 == 0 成立,仅因末位是 0。
→ 无论前面数字如何,整个拼接数的个位永远等于数组最后一个元素的个位。
→ 因此,拼接数能被 10 整除 ⇔ 最后一个元素的个位为 0 ⇔ A[N-1] % 10 == 0。
❌ 原代码缺陷详解:
- 使用
double ans和Math.pow(10, j)拼接大数:当N较大(如 ≥15)时,Math.pow(10, j)产生浮点精度误差,导致ans计算失准; - 强转
(int) ans可能截断或四舍五入错误; -
if (ans % 10 == 0)判断的是 double 类型,语义模糊且不可靠; - 多余的数组
arr[]和循环,增加复杂度与出错概率。
✅ 正确解法(简洁高效):
只需读取数组,直接检查最后一个数是否以 0 结尾:
import java.util.Scanner;
class TestClass {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int N = s.nextInt();
if (N <p>? <strong>注意事项</strong>: </p>
- 不需要存储全部个位,更无需构造大整数;
- 边界处理:若
N == 0,应安全返回"No"(空数组无法构成有效数); - 时间复杂度:O(1) —— 仅访问最后一个元素;空间复杂度:O(1)(除输入数组外);
- 此结论成立的前提是“拼接顺序严格按数组索引从左到右”,题目明确要求“last digit of all the N numbers”,即顺序拼接。
? 延伸思考:
若题目改为判断能否被 2 或 5 整除?答案仍只取决于拼接数的个位(即 A[N-1] % 10);
若改为判断能否被 3 或 9 整除?则需所有个位数字之和(因为 3/9 整除性看各位和);
但对 10 的整除性,唯一决定因子就是末位数字——这是十进制数的基本性质。










