首页 > 试题广场 >

九倍平方数

[编程题]九倍平方数
  • 热度指数:6876 时间限制: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 整除。
头像 Silencer76
发表于 2025-08-08 22:00:00
题目链接 九倍平方数 题目描述 给定一个不含前导零的十进制数字串 (长度 )。你可以多次执行以下操作: 选择 中的某一位数字 。 将该位数字替换为 。如果 是一个多位数(例如 ),它会替换掉原来的单个数字 ,从而可能改变数字串的长度。 若通过若干次(可为 0 次)操作可以使最终数字能被 9 展开全文
头像 赶due_ing
发表于 2025-08-11 20:44:14
我们知道每一位数加起来是9的倍数的可以被9整除,diffNine代表了所有位加起来还差多少能被9整除,比如diffNine算得2,问题变成了需要多少2(由2->4位和增加2),6(由3->9位和增加6)组合得到2+9n。通过遍历得到2,3的个数,设为m,n。即: 2m+6n=diff+9 展开全文
头像 CARLJOSEPHLEE
发表于 2025-07-14 16:29:41
from sys import stdin,stdout read1 = stdin.read().split() ans = [] for index in range(int(read1[0])): n = [int(i) for i in read1[index+1]] k = 展开全文
头像 BraveCoder
发表于 2025-08-27 21:25:14
要解决这个问题,我们需要判断一个数字串是否能通过特定操作(将数字替换为其平方,仅当平方小于 10 时)转化为能被 9 整除的数。核心依据是能被 9 整除的数的特性:各位数字之和能被 9 整除,结合操作对数字和的影响推导判断逻辑。一、问题分析与核心逻辑1. 操作对数字和的影响仅当数字 x ∈ {0,1 展开全文
头像 Xiettt
发表于 2026-02-11 20:09:40
#include<bits/stdc++.h> using namespace std; using ll=long long; using ull=unsigned long long; using i128=__int128_t; using u128=__uint128_t; u 展开全文
头像 我是芭芭拉的狗
发表于 2025-12-24 19:21:47
n = int(input()) while True: try: n = input() s = 0 shu2 = 0 shu3 = 0 for i in n: s += int(i) 展开全文
头像 立花泷之介
发表于 2026-02-12 11:36:44
重要数学知识:能被9整除,在于各位数之和为9的倍数,即summ % 9 = 0,如果有余数,那么余数就是差的部分。0 1 没必要; 2 3 能平方; 4-9 都不行;一个2贡献2的增量,一个3贡献6的增量因此我们要统计整个字符串里2和3出现的次数cnt_2,cnt_3,然后以2和3的次数为上限进行双 展开全文
头像 不要葱花的小饼干很开心
发表于 2026-02-14 15:38:56
首先,本题根据“某正整数可被9整除,当且仅当该数的各个数位的数字之和能被9整除”的数学思想,计算出该数各数位数字之和。注意将char转换为int时使用s[i]-'0'而非static_cast<int> (s[i]),后者是将字符转换成了ascll码。其次,使用暴力枚举的解法,根据各数之 展开全文
头像 意若久时天然呆
发表于 2026-01-22 13:54:39
import sys t = int(sys.stdin.readline()) for _ in range(t): n, n2, n3, s1 = list(map(int, sys.stdin.readline().strip())), 0, 0, 0 for i in n: 展开全文
头像 湮雨
发表于 2025-08-21 10:51:08
#include <iostream> using namespace std; bool isGoodNum(const string& s){ int sum=0; int cnt2=0; int cnt3=0; for(char c:s){ 展开全文