你好,我是林森 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) 共有多少个?
拆解所有要求
- 固定常数:
N = 2026202520242023,是一个 16 位的正整数 - 拆分规则:两个非负整数 x、y,满足
x + y = N - 大小约束:
0 ≤ x < y,y 必须严格大于 x - 输出要求:满足条件的整数对总个数,只输出一个整数
二、核心知识点
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. 第一步:根据条件列关系式
题目给出两个核心约束:
- 数值和:
x + y = N→ 变形得y = N - x - 大小关系:
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
++就到这里,诸位共勉!++
