首页 > 试题广场 >

九倍平方数

[编程题]九倍平方数
  • 热度指数:3283 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个不含前导零的十进制数字串 n(长度 \leqq10^5)。你可以多次执行以下操作:
\hspace{23pt}\bullet\, 选择 n 中的某一位数字 x\ (0\leqq x\leqq9)
\hspace{23pt}\bullet\,x^2<10,将该位替换为 x^2

\hspace{15pt}若通过若干次(可为 0 次)操作可以使最终数字能被 9 整除,则称数字串 n 为好数。判断每个测试用例的数字串 n 是否为好数

输入描述:
\hspace{15pt}第一行输入整数 t\left(1\leqq t\leqq 10^4\right),表示测试用例数量。
\hspace{15pt}随后 t 行,每行一个数字串 n,长度 \leqq10^5,保证所有用例数字串 n 的总长度 \leqq10^5


输出描述:
\hspace{15pt}对每个用例输出 ``\text{YES}`` 或 ``\text{NO}``(大写),表示是否存在操作序列使得最终数字能被 9 整除。
示例1

输入

9
123
322
333333333333
9997
5472778912773
1234567890
23
33
52254522632

输出

NO
YES
YES
NO
NO
YES
NO
YES
YES

说明

在第一组样例中,从整数 123 中只能得到 123143129149 ,它们都不能被 9 整除。

在第二组样例中,需要将第二个数字替换为它的平方,那么 n 就等于 342 = 38 \cdot 9

在第三组样例中,整数已经可以被 9 整除。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        scanner.nextLine(); // 吸收换行符
        
        while (t-- > 0) {
            String n = scanner.nextLine();
            long sBase = 0; // 初始数字和
            int cnt2 = 0;   // 数字2的个数
            int cnt3 = 0;   // 数字3的个数
            
            // 计算初始和及2、3的数量
            for (char c : n.toCharArray()) {
                int d = c - '0';
                sBase += d;
                if (d == 2) {
                    cnt2++;
                } else if (d == 3) {
                    cnt3++;
                }
            }
            
            boolean isGood = false;
            
            // 枚举b的可能值(0, 1, 2),但不能超过实际数量cnt3
            int maxB = Math.min(2, cnt3);
            for (int b = 0; b <= maxB; b++) {
                // 枚举a的可能值(0-8),但不能超过实际数量cnt2
                int maxA = Math.min(8, cnt2);
                for (int a = 0; a <= maxA; a++) {
                    // 计算当前总和:初始和 + 2a(每个2操作增加2) + 6b(每个3操作增加6)
                    long total = sBase + 2L * a + 6L * b;
                    if (total % 9 == 0) {
                        isGood = true;
                        break;
                    }
                }
                if (isGood) break;
            }
            
            System.out.println(isGood ? "YES" : "NO");
        }
        scanner.close();
    }
}

发表于 2025-08-27 21:19:18 回复(0)