top1编程
← 返回题目
题解

与7无关的数之和

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4360 与7无关的数之和(【入门】)

    解题思路

    "与 7 相关"有两种情况:是 7 的倍数,或者个位是 7(比如 17、27、47)。题目要我们把 1 到 nn 之间所有"与 7 无关"的数加起来。

    判断一个数 ii 是否与 7 相关:

    • 是 7 的倍数:i % 7 == 0;
    • 个位是 7:i % 10 == 7(除以 10 的余数就是个位)。

    两种情况只要满足一种就要跳过,用 continue 跳过当前这个数,剩下的数累加到 sum 里。

    拿样例 n=100n=100 来说,1 到 100 的总和是 5050,减去所有 7 的倍数(7、14、…、98)的和 735,再减去个位是 7 但又不是 7 的倍数的数(17、27、37、47、57、67、87、97)的和 436,得到 5050−735−436=38795050-735-436=3879,和样例一致。

    边界情况:i=7i=7 既是 7 的倍数个位也是 7,只跳过一次就行;i=77i=77 同理。nn 最大 200,总和不会太大,用一个 int 变量装绰绰有余。

    参考代码

    // 求1~n中与7无关的数(不是7的倍数且个位不是7)之和
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            // 是7的倍数 或 个位是7,都算与7相关,跳过
            if (i % 7 == 0 || i % 10 == 7) continue;
            sum += i;
        }
        cout << sum << endl;
        return 0;
    }
    

    复杂度分析

    从 1 循环到 nn,每个数只做两次取模判断,nn 最大 200,所以时间复杂度是 O(n)O(n)。只用一个整数变量装总和,额外空间复杂度是 O(1)O(1)。

    • 1