文章

【GESP】C++二级练习 luogu-B3786, [信息与未来 2023] 幸运数字

GESP二级练习,多层循环分支嵌套练习,难度★✮☆☆☆。

luogu-B3786 [信息与未来 2023] 幸运数字

题目要求

题目描述

如果把一个数字十进制表示的奇数位和偶数位分别相加得到的和相同,小小就认为它是一个幸运的数字。例如:

  • $12345$ 奇数位相加 $1 + 3 + 5 = 9$、偶数位相加 $2 + 4 = 6$,因此 $12345$ 不是幸运数字;

  • $2332$ 奇数位相加 $2 + 3 = 5$、偶数位相加 $3 + 2 = 5$,因此 $2332$ 是幸运数字。

对于给定的 $a$ 和 $b$,小小希望你求出 $a,a + 1, a + 2,\dots, b$ 中幸运数字的数量。

输入格式

输⼊数据仅一行,包含空格分隔的两个整数 $a$ 和 $b$。

输出格式

输出一行一个整数,代表 $a, a + 1, a + 2,\dots, b$ 中幸运数字的数量。

样例输入 #1

1
1 100

样例输出 #1

1
9

样例输入 #2

1
4096 65536

样例输出 #2

1
3454

提示

  • 对于 $100\%$ 的数据,满足 $1\leq a\leq b\leq 10^6$。

题目分析

  1. 首先,我们需要读取输入的范围a和b。
  2. 接着,我们需要遍历从a到b的所有数字,检查每个数字是否为幸运数字。
  3. 为了检查一个数字是否为幸运数字,我们需要将其分解为奇数位和偶数位,并分别计算它们的和。
  4. 如果奇数位和偶数位的和相等,则该数字为幸运数字,我们需要统计这些幸运数字的数量。
  5. 最后,我们输出统计到的幸运数字的数量。

在实现时,我们可以使用一个循环来遍历从a到b的所有数字,并在循环中使用另一个循环来分解当前数字并计算奇数位和偶数位的和。

示例代码

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 a, b; // 定义变量a和b,用于存储输入的范围
    cin >> a >> b; // 从输入流中读取a和b的值
    int count = 0; // 初始化计数器,用于统计幸运数字的数量
    for (int i = a; i <= b; i++) { // 遍历从a到b的所有数字
        bool isOdd = true; // 初始化标志,用于标记当前数字是否为奇数
        int oddSum = 0; // 初始化奇数位数和
        int evenSum = 0; // 初始化偶数位数和
        int curNum = i; // 当前数字
        while (curNum != 0) { // 当当前数字不为0时,继续循环
            int digit = curNum % 10; // 获取当前数字的最后一位
            if (isOdd) {
                oddSum += digit; // 如果当前位是奇数位,则将数字加到奇数位数和中
            } else {
                evenSum += digit; // 如果当前位是偶数位,则将数字加到偶数位数和中
            }
            isOdd = !isOdd; // 切换标志,用于下一位的判断
            curNum /= 10; // 移除当前数字的最后一位
        }
        if (oddSum == evenSum) { // 如果奇数位数和与偶数位数和相等,则当前数字为幸运数字
            count++; // 增加计数器
        }
    }
    cout << count; // 输出计数器的值,即幸运数字的数量
    return 0;
}

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

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

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

本文由作者按照 CC BY 4.0 进行授权