P10424 [蓝桥杯 2024 省 B] 好数——Java解答

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. 检查奇数位:直接从个位开始,每次取最后一位数字判断是否为奇数,然后通过/=100跳过两位(同时跳过下一个偶数位)
  2. 检查偶数位:先去掉个位(/=10),让十位变成新的个位,再用同样的方式检查并跳过两位 这种方法避免了复杂的位次计算,通过两次简洁的循环就能完成检查。对于每个数字,我们只需遍历其一半的位数,大大提升了效率。

在goodNum()方法中,用了两个错位循环来"跳位"判断:

一个从个位 开始,每次跳两位(num1 /= 100),只判断奇数位

另一个从十位开始,每次跳两位(num /= 100),只判断偶数位

java 复制代码
import java.util.Scanner;

public class Main {

    // 判断数字是否为偶数
    public static boolean oddEven(int num) {
        return num % 2 == 0;
    }

    // 判断一个数是否为"好数"
    public static boolean goodNum(int num) {
        int num1 = num;
        // 检查所有奇数位(个位、百位、万位...)
        while (num1 > 0) {
            int digit = num1 % 10; // 取当前最低位(奇数位)
            if (oddEven(digit)) {  // 若奇数位是偶数 -> 不符合
                return false;
            }
            num1 /= 100; // 移除后两位(跳到下一个奇数位)
        }

        // 检查所有偶数位(十位、千位...)
        num /= 10; // 移除个位,使十位成为最低位
        while (num > 0) {
            int digit = num % 10; // 取当前最低位(偶数位)
            if (!oddEven(digit)) { // 若偶数位是奇数 -> 不符合
                return false;
            }
            num /= 100; // 移除后两位(跳到下一个偶数位)
        }
        return true; // 所有位均满足条件
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int count = 0;
        for (int i = 1; i <= N; i++) {
            if (goodNum(i)) {
                count++;
            }
        }
        sc.close();
        System.out.println(count);
    }
}
相关推荐
Zane199413 分钟前
单例线程安全、生产者消费者、死锁:并发面试三连问串讲
java·后端
云烟成雨TD1 小时前
Micrometer 系列【42】链路追踪:Span 体系 | 核心 API
java·链路追踪·micrometer
Gorway1 小时前
理解 Spring 依赖注入:从构造器注入到集合与条件 Bean
java·后端
LiLiYuan.1 小时前
【字符串常量池】
java·开发语言·面试
Sylvia33.1 小时前
从轮询到推送:足球数据API架构演进与火星数据技术拆解
java·服务器·网络·python·websocket·架构
cfm_29142 小时前
高并发系统缓存全解
java·缓存
Ghost Face...2 小时前
龙芯Docker全流程:安装到离线迁移实战
java·docker·eureka
16月6日-晴2 小时前
Java面向对象进阶—static
java·开发语言
xiaohaiAIgeo2 小时前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识
meilindehuzi_a3 小时前
TypeScript面试题:interface 与 type:相同点、核心区别与选择指南
java·ubuntu·typescript