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);
    }
}
相关推荐
SamDeepThinking12 分钟前
第1篇-开篇词:几亿用户规模下,我们是怎么做C端高并发商品系统的
java·后端·架构
weisian15112 分钟前
Java并发编程--47-分布式ID生成器:雪花算法(Snowflake)与时钟回拨问题
java·算法·时钟回拨·雪花算法id
itzixiao13 分钟前
L1-066 猫是液体(5分)[java][python]
java·开发语言·python·算法
冷小鱼20 分钟前
MyBatis 与 MyBatis-Plus:从入门到精通的完整指南
java·tomcat·mybatis
DolphinScheduler社区30 分钟前
DolphinScheduler 3.3.2 如何调用 DataX 3.0 + SeaTunnel 2.3.12?附 Demo演示!
java·spark·apache·海豚调度·大数据工作流调度
亦暖筑序1 小时前
AI 客服系统安全加固:JWT 鉴权 + Bucket4j 三层限流
java·架构
xhuiting1 小时前
项目技术总结
java
某人辛木1 小时前
JDK安装配置
java·开发语言
counting money1 小时前
Spring框架基础(依赖注入-全注解形式)
java·数据库·spring
小王师傅661 小时前
【Java结构化梳理】泛型-初步了解-下
java·开发语言