【日耕一题】5. 青春常数(17届蓝桥杯C++B组第一题)

你好,我是林森 lsjs

我的 Github 地址: sqyCoder (Qiyang) · GitHub

欢迎来到日耕一题,今天这道蓝桥杯填空题,实际上根本不用写循环暴力枚举

核心考的是不等式推导数据类型边界意识

一、题目完整解读

原题

试题 A: 青春常数

本题总分:5 分

小蓝与蓝桥杯的缘分已经走到了第四个年头。从 2023 年的初出茅庐,到 2024、2025 年的披荆斩棘,而今年的 2026 年,将是他大学生涯最后一次站上这个赛场。

退役前夕,百感交集的小蓝在草稿纸上将这四届参赛的年份倒序写下,拼接成了一个巨大的整数:N = 2026202520242023

在整理四年的竞赛心得时,他决定将这一常数 N 拆分为两个非负整数 x 和 y,分别代表他这段旅程的前半段积累与后半段突破。按照拆分规则,两部分的数值之和必须恰好等于 N(即 x + y = N)。

同时,由于在后半段赛程中小蓝积累了更深厚的算法功底,因此后半部分的数值 y 必须严格大于前半部分的数值 x(即 0 ≤ x < y)。

请你计算满足上述条件的整数对 (x, y) 共有多少个?

拆解所有要求

  1. 固定常数:N = 2026202520242023,是一个 16 位的正整数
  2. 拆分规则:两个非负整数 x、y,满足 x + y = N
  3. 大小约束:0 ≤ x < y,y 必须严格大于 x
  4. 输出要求:满足条件的整数对总个数,只输出一个整数

二、核心知识点

1. 不等式转化:双变量变单变量

这是这道题的核心思想。两个未知数搭配两个约束条件,直接代入消元

就能把双变量问题转化为单变量的取值范围问题,根本不需要循环枚举。

2. Java 整数数据类型范围

int:32 位,最大值为 2^31-1 ≈ 21亿(10 位数字),完全装不下 16 位的 N

long:64 位,最大值为 2^63-1 ≈ 9×10^18(19 位数字),可以轻松容纳这个 16 位数

定义 long 型常量时,末尾必须加L,否则编译器会按 int 处理直接报错

3. 为什么暴力枚举不可行

就算你用 long 写循环,从 0 遍历到 N/2,也要循环约 10^16 次。就算 CPU 每秒跑 10 亿次循环,也要跑上万年,算法题永远不是拼蛮力,而是找规律、推公式。

三、分步推导 , 逐行讲解

1. 第一步:根据条件列关系式

题目给出两个核心约束:

  1. 数值和:x + y = N → 变形得 y = N - x
  2. 大小关系:0 ≤ x < y

2. 第二步:代入消元,求 x 的范围

y = N - x 代入不等式 x < y

复制代码
x < N - x

移项合并:

复制代码
2x < N  →  x < N / 2

再结合 x 的左边界 x ≥ 0,最终 x 的完整取值范围是:

0 ≤ x < N/2

也就是说,所有满足这个范围的非负整数 x,都对应一个合法的 y,也就是一组合法的整数对。问题最终转化为:求这个区间内有多少个整数。

3. 第三步:分奇偶计算整数个数

这里必须分情况讨论,N 是奇数还是偶数,结果不一样:

情况 1:N 是偶数,N = 2k,则 x < k。x 可取 0,1,2,...,k-1,一共 k 个整数,总个数 = N / 2

情况 2:N 是奇数,N = 2k + 1,则 x < k + 0.5。x 可取 0,1,2,...,k,一共 k+1 个整数,总个数 = (N + 1) / 2

回到题目,N = 2026202520242023,最后一位是 3,显然是奇数,直接套用奇数公式即可。

四、完整可运行代码(Java 版)

虽然是填空题,但我们可以用几行代码快速验证结果,核心是必须用 long 类型

java 复制代码
public class Main {
    public static void main(String[] args) {
        // 1. 定义常量N,末尾加L声明为long类型,防止int溢出
        long N = 2026202520242023L;
        long count;

        // 2. 判断奇偶,套用对应计数公式
        if (N % 2 == 0) {
            count = N / 2;
        } else {
            count = (N + 1) / 2;
        }

        // 3. 输出最终结果
        System.out.println(count);
    }
}

逐行注意点

数字末尾必须加L:如果写成2026202520242023,编译器会默认它是 int 类型,直接报 "整数太大" 错误

奇偶判断用% 2 == 0,是最稳妥的写法

long 类型的除法是整数除法,自动向下取整,和我们的推导完全匹配

五、结果计算与正确性验证

运行上面的代码,输出结果为:

复制代码
1013101260121012

小例子验证公式

我们用小数目验证公式是否正确:

N=5(奇数):按公式得 (5+1)/2=3,对应 (0,5)(1,4)(2,3),共 3 对,正确

N=4(偶数):按公式得 4/2=2,对应 (0,4)(1,3),共 2 对,正确

公式逻辑没问题,long 类型也完全容纳 16 位数字,不会溢出,因此最终结果正确。

六、总结~

核心:这道题本质是数学题,不是编程题。把x+y=N代入不等式,推导出 x 的取值范围,直接按奇偶算整数个数就行,完全不需要循环。

避坑:

数据类型溢出:N 远超 int 范围,必须用 long,常量末尾加 L

左边界漏算:x 可以取 0,不要从 1 开始计数

奇偶不分:奇数和偶数的计数公式不一样,别直接统一除以 2

++就到这里,诸位共勉!++

相关推荐
Tisfy1 小时前
LeetCode 3838.带权单词映射:求和、取模、拼接(附python一行版)
python·算法·leetcode·字符串·题解·模拟·取模
め.1 小时前
GJK算法实现细节
算法
AI科技星1 小时前
第六卷:量天尺传奇(几何学)
网络·人工智能·算法·概率论·学习方法·几何学·拓扑学
Y_Bk1 小时前
第十七届蓝桥杯C/C++A组省赛
c语言·数据结构·c++·算法·蓝桥杯
帅小伙―苏1 小时前
力扣76最小覆盖子串
算法·leetcode
RH2312112 小时前
2026.5.24 数据结构 KMP算法实现
数据结构·算法
江屿风2 小时前
C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂
开发语言·c++·笔记·算法·图论
浮芷.2 小时前
鸿蒙 6.1 新特性-60fps流畅人物跳跃功能算法深度解析-鸿蒙PC端正弦值计算法
算法·华为·harmonyos·鸿蒙·鸿蒙系统
AI科技星2 小时前
数术工坊·第八卷 大道归一录・番外・下篇 零界封神・万法归元终章
网络·人工智能·算法·几何学·拓扑学