【日耕一题】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

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

相关推荐
mingo_敏20 分钟前
Mean-Teacher 均值教师自训练框架详解
算法·均值算法
星空露珠1 小时前
迷你世界UGc3.0脚本Wiki[剧情动画模块管理接口 Timeline]
开发语言·数据结构·算法·游戏·lua
笨笨没好名字1 小时前
Leetcode刷题python3版第一周(下)
linux·算法·leetcode
手写码匠1 小时前
手写 LLM 安全护栏:从内容审核到越狱防御的完整实现
人工智能·深度学习·算法·aigc
luj_17681 小时前
草酸与烟酸对消化及糖代谢的影响解析
服务器·c语言·开发语言·经验分享·算法
青风971 小时前
16-ADAPTRACK:基于自适应阈值的多目标跟踪匹配算法
人工智能·算法·目标跟踪
汤姆yu2 小时前
macOS系统下Aider完整安装、配置与实战使用教程
大数据·人工智能·算法·macos·github·copilot
Sam09272 小时前
【AI 算法精讲 14】TF-IDF:词频与逆文档频率
人工智能·python·算法·ai
AI科技星2 小时前
拓扑生命系统确定性理论:基于32维流形的遗传密码起源与衰老动力学( 中英双语顶刊终稿·标准数学符号)
开发语言·网络·人工智能·算法·机器学习·乖乖数学·全域数学
编程圈子2 小时前
电机驱动开发学习18. SVPWM空间矢量调制算法详解与实现
驱动开发·学习·算法