文章

【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 进行授权