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);
    }
}
相关推荐
AI你一生一世2 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影3 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯3 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
海的透彻7 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat7 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习8 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one8 小时前
算法--构造
java·数据结构·算法
SL_staff8 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff9 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko710 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端