小杨认为一个正整数是“美丽数字”,当且仅当这个数的每一位数字相加的总和是 7 的倍数。
现在给出 n 个正整数,我们需要对每一个数判断它是否为美丽数字。
核心任务:
分解数位 + 累加求和 是本题最直接的思路。
对于一个整数 x,我们可以不断做以下操作,直到 x 变为 0:
x % 10;x = x / 10(整数除法向下取整)。计算完总和 tot 后,只需检查 tot % 7 == 0:
Yes;No。由于每个数字要单独处理,我们需要用循环结构依次读入 n 个整数,对每个整数执行上述步骤并输出结果。
以参考代码为例进行解释:
cpp1#include<bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; // 读入正整数个数 7 for (int i = 1; i <= n; i++) { 8 int x; 9 cin >> x; // 读入当前要判断的数 10 int tot = 0; // 用于累加数位之和 11 while (x) { // 当 x 不为 0 时循环 12 tot += (x % 10); // 取出个位,累加到 tot 13 x /= 10; // 去掉个位 14 } 15 if (tot % 7 == 0) // 判断总和是否为 7 的倍数 16 cout << "Yes\n"; 17 else 18 cout << "No\n"; 19 } 20 return 0; 21}
关键点说明:
while (x) 循环可以正确处理 x 的每一位,包括 x=0 的情况吗?根据数据范围 ai≥1,所以不需要处理 0。tot % 7 == 0 利用取模运算直接判断是否是 7 的倍数。对于每一个正整数 ai,其数位分解的循环次数等于该数的位数。
数据范围中 ai≤105,最大为 100000,位数最多为 6 位。
因此,单次处理一个数的时间复杂度是 O(1)(常数级别)。
一共 n 个数,总时间复杂度为 O(n),在 n≤105 时可以在题目要求的 1000ms 内轻松通过。
空间复杂度:只用了少量变量,为 O(1)。
本题是一道简单的模拟题,考察循环、取模、整数除法等基础操作。只要熟练掌握“取出一个整数各位数字”的方法,就能快速求解。注意输出的大小写要与题目要求一致(首字母大写,其余小写)。