题解:洛谷 B4035 美丽数字
【题目来源】
洛谷:B4035 [GESP202409 一级] 美丽数字 - 洛谷
【题目描述】
小杨有\(n\)个正整数,他认为一个正整数是美丽数字当且仅当该正整数是\(9\)的倍数但不是\(8\)的倍数。小杨想请你编写一个程序计算\(n\)个正整数中美丽数字的数量。
【输入】
第一行包含一个正整数\(n\),代表正整数个数。
第二行包含\(n\)个正整数\(a_1,a_2,a_3,\dots, a_n\)。
【输出】
输出一个整数,代表其中美丽数字的数量。
【输入样例】
3
1
9
72
【输出样例】
1
【核心思想】
-
问题分析:给定 \(n\) 个正整数,统计其中是 \(9\) 的倍数但不是 \(8\) 的倍数的数的个数。这是一个整除性判定问题,核心在于同时检查两个互斥的整除条件。
-
算法选择:
- 取模判定:\(x \bmod 9 = 0\) 且 \(x \bmod 8 \neq 0\)
- 计数器累加:维护满足条件的数的计数器 \(ans\)
-
关键步骤:
- 读入数据:读取 \(n\)
- 逐数判定(\(i\) 从 \(1\) 到 \(n\)):
- 读入 \(x\)
- 若 \(x \bmod 9 = 0\) 且 \(x \bmod 8 \neq 0\):\(ans \leftarrow ans + 1\)
- 输出结果:\(ans\)
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),每个数两次取模判断
- 空间复杂度:\(O(1)\),仅使用一个计数器
-
整除性判定的核心思想:
- 合取条件:"是 \(9\) 的倍数"和"不是 \(8\) 的倍数"两个条件必须同时满足,使用逻辑与
&&连接 - 取模运算的高效性:\(x \bmod m = 0\) 是判断整除的标准方法,时间复杂度 \(O(1)\)
- 互斥条件的处理:注意区分"不是 \(8\) 的倍数"(\(x \bmod 8 \neq 0\))和"是 \(8\) 的倍数"(\(x \bmod 8 = 0\)),题目要求的是前者
- 在线统计:读入一个数立即判定并更新计数器,无需存储所有数
- 适用于基础数论条件筛选、多条件组合判定类入门问题
- 合取条件:"是 \(9\) 的倍数"和"不是 \(8\) 的倍数"两个条件必须同时满足,使用逻辑与
【算法标签】
入门 #数学
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, ans; // n: 数字个数, ans: 满足条件的数字个数
int main()
{
cin >> n; // 输入数字个数
for (int i = 1; i <= n; i++) // 遍历每个数字
{
int x; // 当前数字
cin >> x;
// 判断条件:能被9整除,但不能被8整除
if (x % 9 == 0 && x % 8 != 0)
{
ans++; // 如果满足条件,计数器加1
}
}
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
3
1
9
72
1
浙公网安备 33010602011771号