与 7 无关的数

与 7 无关的数

GESP二级练习,涉及多层条件和循环嵌套,难度★✮☆☆☆。

luogu-b2081

题目要求

题目描述

一个正整数,如果它能被 77 整除,或者它的十进制表示法中某一位上的数字为 77,则称其为与 77 相关的数。现求所有小于等于 n(n<100)n(n<100)77 无关的正整数的平方和。

输入格式

输入为一行,正整数 n(n<100)n(n<100)

输出格式

输出一行,包含一个整数,即小于等于 nn 的所有与 77 无关的正整数的平方和。

样例输入 #1

21

样例输出 #1

2336

题目分析

这是一个简单的数学问题,需要我们找出所有小于等于 nn 的与 77 无关的正整数,并计算它们的平方和。我们可以使用一个循环来遍历所有小于等于 nn 的数,然后判断每个数是否与 77 无关。如果与 77 无关,我们就将它的平方加到答案中。最后,我们输出答案即可。

本题解答过程中,孩子利用了输入数据的数据范围限制,“简化”写死了判断与 77 无关的数的方法,即只判断一位数、两位数的情况。

{% include custom/custom-post-content-inner.html %}

示例代码

方法一

利用了输入数据的数据范围限制,直接法

#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练习类似逻辑,拓展到任意情况通用方法

#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;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on