题解
【入门】与7无关的数
1 条题解
-
0
解题思路
题目要我们做的,是找出 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