top1编程
← 返回题目
题解

【入门】与7无关的数

1 条题解

  • 0
    @ 2026-8-1 10:21:05

    解题思路

    题目要我们做的,是找出 1 到 n 里面“与7无关”的数,然后把它们加起来。

    先搞清楚什么是“与7有关的数”。题目说了两种情况:

    • 这个数能被 7 整除(比如 7、14、21,它们都是 7 的倍数);
    • 这个数的某一位数字是 7(比如 17 的个位是 7,70 的十位是 7,700 的百位是 7)。

    只要满足其中任意一种情况,这个数就是“与7有关的数”,我们就要把它排除掉。

    举几个例子:

    • 14:14 ÷ 7 = 2,能被 7 整除,所以 14 是“与7有关的数”,要排除;
    • 17:17 不能被 7 整除,但是它的个位是 7,所以它也是“与7有关的数”,要排除;
    • 8:8 不能被 7 整除,而且 8 只有一位,这一位也不是 7,所以 8 是“与7无关的数”,要累加;
    • 10:10 不能被 7 整除,个位是 0、十位是 1,都不是 7,所以 10 是“与7无关的数”,要累加。

    怎么判断一个数“有没有某一位是 7”呢?我们可以一位一位地拆出来看。因为 n 最大是 999(三位数),最多只需要看三位:

    • 个位:i % 10(除以 10 的余数,就是最右边那一位);
    • 十位:i / 10 % 10(先除以 10 去掉个位,再取余数得到新的个位,也就是原来的十位);
    • 百位:i / 100(三位数除以 100,得到的就是百位)。

    比如 i = 178:

    • 个位 = 178 % 10 = 8;
    • 十位 = 178 / 10 % 10 = 17 % 10 = 7;
    • 百位 = 178 / 100 = 1。

    果然,178 的十位是 7,所以 178 是“与7有关的数”。

    算法就很简单了:用一个 sum 变量存总和,让 i 从 1 到 n 一个一个检查。如果 i 能被 7 整除,或者 i 的百位、十位、个位里有任何一位是 7,就跳过它;否则把 i 加进 sum。最后输出 sum。

    以样例 n = 10 为例: 1、2、3、4、5、6 都既不能被 7 整除、每一位也不是 7,全部累加(和是 21); 7 能被 7 整除,跳过; 8、9、10 都无关,累加(8+9+10=27); 总和 = 21 + 27 = 48,和样例输出一致。

    参考代码

    #include <iostream>  // 用于 cin/cout 输入输出
    
    using namespace std;
    
    int main()
    {
        int n;        // 输入的整数范围:1 ~ n
        int i;        // 循环变量,代表当前检查的数
        int d;        // 用来临时存放每一位数字
        int sum = 0;  // 累加与7无关的数的总和
    
        cin >> n;  // 读入 n
    
        // 从 1 一直检查到 n
        for (i = 1; i <= n; i++)
        {
            // 情况一:i 能被 7 整除,是“与7有关的数”,跳过不累加
            if (i % 7 == 0)
            {
                continue;
            }
    
            // 情况二:检查每一位是不是 7
            // 先看个位:i 的个位数字是 i % 10
            d = i % 10;
            if (d == 7)
            {
                continue;
            }
    
            // 再看十位:i 的十位数字是 i / 10 % 10
            d = i / 10 % 10;
            if (d == 7)
            {
                continue;
            }
    
            // 最后看百位:i 的百位数字是 i / 100
            d = i / 100;
            if (d == 7)
            {
                continue;
            }
    
            // 走到这里,说明 i 既不能被 7 整除,每一位也都不是 7
            // 它是“与7无关的数”,累加进总和
            sum = sum + i;
        }
    
        cout << sum << endl;  // 输出总和
    
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(n)。我们要把 1 到 n 的每一个数都检查一遍,n 最大是 999,循环次数最多只有 999 次,非常快。
    • 空间复杂度:O(1)。只用了几个 int 变量(n、i、d、sum),不管 n 多大,占用的空间都一样大。
    • 1