好数 第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

好数

题目来源

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

原题链接

蓝桥杯 好数

问题描述

P10424 [蓝桥杯 2024 省 B] 好数

题目描述

一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位......)上的数字是奇数,偶数位(十位、千位、十万位......)上的数字是偶数,我们就称之为"好数"。

给定一个正整数 N N N,请计算从 1 1 1 到 N N N 一共有多少个好数。

输入格式

一个整数 N N N。

输出格式

一个整数代表答案。

输入输出样例 #1

输入 #1

复制代码
24

输出 #1

复制代码
7

输入输出样例 #2

输入 #2

复制代码
2024

输出 #2

复制代码
150

说明/提示

样例 1 解释

24 24 24 以内的好数有 1 , 3 , 5 , 7 , 9 , 21 , 23 1,3,5,7,9,21,23 1,3,5,7,9,21,23,一共 7 7 7 个。

数据规模与约定

  • 对于 10 % 10\% 10% 的测试数据, 1 ≤ N ≤ 100 1 \leq N \le 100 1≤N≤100。
  • 对于全部的测试数据, 1 ≤ N ≤ 1 0 7 1 \le N \leq 10^7 1≤N≤107。

问题分析

代码解释:

  1. check 函数

    • 功能:检查一个数字是否是"好数"。
    • 实现:
      • 将数字 x 的每一位分解并存储到数组 num 中。
      • 遍历数组 num,检查每一位是否符合"好数"的条件:
        • 奇数位(第 1、3、5... 位)必须是奇数。
        • 偶数位(第 2、4、6... 位)必须是偶数。
      • 如果所有位都符合条件,则返回 true,否则返回 false
  2. main 函数

    • 输入数字 n,表示需要检查的范围 [1, n]
    • 遍历范围 [1, n],调用 check 函数检查每个数字是否是"好数"。
    • 统计"好数"的数量并输出结果。

示例:

  • 输入:n = 20
  • 输出:10
  • 解释:在 [1, 20] 范围内,"好数"有:1, 3, 5, 7, 9, 10, 12, 14, 16, 18。

总结:

通过分解数字的每一位并检查其奇偶性,判断一个数字是否是"好数",并统计给定范围内的"好数"数量。

完整代码

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e7 + 10;  // 定义常量 N,表示最大可能的数字范围

int n;  // 定义整数 n,表示需要检查的数字范围 [1, n]

// 检查一个数字是否是"好数"
bool check(int x) {
    int num[8];  // 定义一个数组,用于存储数字 x 的每一位数字
    int idx = 0; // 定义索引 idx,用于记录当前存储的位数

    // 将数字 x 的每一位分解并存储到数组 num 中
    while (x) {
        num[idx++] = x % 10;  // 取出当前最低位数字,并存储到 num 中
        x /= 10;              // 去掉最低位,继续处理下一位
    }

    // 遍历数组 num,检查每一位是否符合"好数"的条件
    for (int i = 0; i < idx; i++) {
        // 如果当前是奇数位(第 1、3、5... 位),但数字是偶数,则不是"好数"
        if ((i + 1) % 2 == 1 && num[i] % 2 == 0) return false;
        // 如果当前是偶数位(第 2、4、6... 位),但数字是奇数,则不是"好数"
        if ((i + 1) % 2 == 0 && num[i] % 2 == 1) return false;
    }

    // 如果所有位都符合条件,则是"好数"
    return true;
}

int main() {
    // 输入数字 n,表示需要检查的范围 [1, n]
    scanf("%d", &n);

    int res = 0;  // 定义结果变量 res,用于统计"好数"的数量

    // 遍历范围 [1, n],检查每个数字是否是"好数"
    for (int i = 1; i <= n; i++) {
        if (check(i)) res++;  // 如果是"好数",则 res 加 1
    }

    // 输出"好数"的总数
    printf("%d", res);

    return 0;
}
相关推荐
Humbunklung3 小时前
unordered_map使用MFC的CString作为键值遇到C2056和C2064错误
c++·stl·mfc
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔4 小时前
【51单片机】【protues仿真】基于51单片机密码锁系统
c语言·stm32·单片机·嵌入式硬件·51单片机
爱编程的化学家4 小时前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
用户6120414922134 小时前
C语言做的停车场管理系统
c语言·后端·敏捷开发
眠りたいです5 小时前
基于脚手架微服务的视频点播系统-数据管理与网络通信部分的预备工作
c++·qt·ui·微服务·云原生·架构·媒体
烦躁的大鼻嘎5 小时前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新5 小时前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
愚润求学5 小时前
【贪心算法】day10
c++·算法·leetcode·贪心算法
智者知已应修善业5 小时前
【矩阵找最大小所在位置】2022-11-13
c语言·c++·经验分享·笔记·算法·矩阵