【GESP】C++二级练习 luogu-b2081, 与 7 无关的数
GESP二级练习,涉及多层条件和循环嵌套,难度★✮☆☆☆。
luogu-b2081
题目要求
题目描述
一个正整数,如果它能被 $7$ 整除,或者它的十进制表示法中某一位上的数字为 $7$,则称其为与 $7$ 相关的数。现求所有小于等于 $n(n<100)$ 与 $7$ 无关的正整数的平方和。
输入格式
输入为一行,正整数 $n(n<100)$。
输出格式
输出一行,包含一个整数,即小于等于 $n$ 的所有与 $7$ 无关的正整数的平方和。
样例输入 #1
1
21
样例输出 #1
1
2336
题目分析
这是一个简单的数学问题,需要我们找出所有小于等于 $n$ 的与 $7$ 无关的正整数,并计算它们的平方和。我们可以使用一个循环来遍历所有小于等于 $n$ 的数,然后判断每个数是否与 $7$ 无关。如果与 $7$ 无关,我们就将它的平方加到答案中。最后,我们输出答案即可。
本题解答过程中,孩子利用了输入数据的数据范围限制,“简化”写死了判断与 $7$ 无关的数的方法,即只判断一位数、两位数的情况。
示例代码
方法一
利用了输入数据的数据范围限制,直接法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std; // 使用标准命名空间
int main() {
int n; // 定义变量n
cin >> n; // 从输入流中读取n的值
int ans = 0; // 初始化答案变量
for (int i = 1; i <= n; i++) { // 从1到n遍历所有数
if (i % 7 != 0 && i % 10 != 7 && i / 10 % 10 != 7) { // 判断i是否与7无关
ans += i * i; // 如果与7无关,则将i的平方加到答案中
}
}
cout << ans; // 输出答案
return 0;
}
方法二
利用之前b2082练习类似逻辑,拓展到任意情况通用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
int main() {
int n; // 定义变量n
cin >> n; // 从输入流中读取n的值
int ans = 0; // 初始化答案变量
for (int i = 1; i <= n; i++) { // 从1到n遍历所有数
int d = i, num; // 初始化变量d为i,num用于存储每一位数字
bool flag = false; // 初始化标志变量,用于判断i是否与7无关
if (i % 7 == 0) { // 如果i能被7整除,则i与7有关
flag = true;
continue; // 跳过当前循环,继续下一个数
}
while (d != 0) { // 循环直到d变为0
num = d % 10; // 获取d的最后一位数字
if (num == 7) { // 如果最后一位数字是7,则i与7有关
flag = true;
break; // 跳出循环
}
d /= 10; // 移除d的最后一位数字
}
if (!flag) { // 如果i与7无关
ans += i * i; // 将i的平方加到答案中
}
}
cout << ans; // 输出答案
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权