题解:洛谷 B4035 美丽数字

【题目来源】

洛谷:B4035 [GESP202409 一级] 美丽数字 - 洛谷

【题目描述】

小杨有\(n\)个正整数,他认为一个正整数是美丽数字当且仅当该正整数是\(9\)的倍数但不是\(8\)的倍数。小杨想请你编写一个程序计算\(n\)个正整数中美丽数字的数量。

【输入】

第一行包含一个正整数\(n\),代表正整数个数。

第二行包含\(n\)个正整数\(a_1,a_2,a_3,\dots, a_n\)

【输出】

输出一个整数,代表其中美丽数字的数量。

【输入样例】

3
1
9
72

【输出样例】

1

【核心思想】

  1. 问题分析:给定 \(n\) 个正整数,统计其中是 \(9\) 的倍数但不是 \(8\) 的倍数的数的个数。这是一个整除性判定问题,核心在于同时检查两个互斥的整除条件。

  2. 算法选择

    • 取模判定\(x \bmod 9 = 0\)\(x \bmod 8 \neq 0\)
    • 计数器累加:维护满足条件的数的计数器 \(ans\)
  3. 关键步骤

    • 读入数据:读取 \(n\)
    • 逐数判定\(i\)\(1\)\(n\)):
      • 读入 \(x\)
      • \(x \bmod 9 = 0\)\(x \bmod 8 \neq 0\)\(ans \leftarrow ans + 1\)
    • 输出结果\(ans\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),每个数两次取模判断
    • 空间复杂度:\(O(1)\),仅使用一个计数器
  5. 整除性判定的核心思想

    • 合取条件:"是 \(9\) 的倍数"和"不是 \(8\) 的倍数"两个条件必须同时满足,使用逻辑与 && 连接
    • 取模运算的高效性\(x \bmod m = 0\) 是判断整除的标准方法,时间复杂度 \(O(1)\)
    • 互斥条件的处理:注意区分"不是 \(8\) 的倍数"(\(x \bmod 8 \neq 0\))和"是 \(8\) 的倍数"(\(x \bmod 8 = 0\)),题目要求的是前者
    • 在线统计:读入一个数立即判定并更新计数器,无需存储所有数
    • 适用于基础数论条件筛选、多条件组合判定类入门问题

【算法标签】

入门 #数学

【代码详解】

#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
posted @ 2026-07-16 16:27  团爸讲算法  阅读(14)  评论(0)    收藏  举报