P10424 [蓝桥杯 2024 省 B] 好数

题目描述

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

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

输入格式

一个整数 N。

输入输出样例

输入 #1复制

24

输出 #1复制

7

输入 #2复制

2024

输出 #2复制

150

说明/提示

样例 1 解释

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

数据规模与约定

  • 对于 10% 的测试数据,1≤N≤100。
  • 对于全部的测试数据,1≤N≤107。
  • #include <bits/stdc++.h>
    using namespace std;
    
    int n; // 输入的n,表示需要统计1~n中的“好数”
    
    // 判断一个数是否为“好数”
    bool goodnum(int num) {
        int posi = 1;   // 数位位置(从最低位开始计数,最低位为第1位)
        int t;          // 当前位的数字
        
        while (num > 0) {
            t = num % 10; // 取当前最低位的数字
            
            // 问题根源:这里从最低位开始判断,但题目要求的是从左到右的奇数位和偶数位
            // 例如数字123的“第一位”是1(左起),但代码中处理顺序是3(posi=1)、2(posi=2)、1(posi=3)
            
            // 奇数位(posi为1,3,5...)必须是奇数
            if (posi % 2 == 1) {
                if (t % 2 == 0) { // 如果当前位是偶数,则不符合要求
                    return false;
                }
            }
            // 偶数位(posi为2,4,6...)必须是偶数
            else {
                if (t % 2 == 1) { // 如果当前位是奇数,则不符合要求
                    return false;
                }
            }
            
            num /= 10;   // 移除最低位
            posi++;      // 数位位置递增
        }
        
        return true; // 所有位都符合要求
    }
    
    int main() {
        int cnt = 0;    // 统计“好数”的数量
        cin >> n;
        
        // 遍历1~n,逐个判断是否为“好数”
        for (int i = 1; i <= n; i++) {
            if (goodnum(i)) {
                cnt++;
            }
        }
        
        cout << cnt << endl;
        return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值