OneCoder Avatar
OneCodercoderli.com · 955 篇博文
二级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【勾股定理与数列平方递推】GESP二级题解:luogu-B4575 [GESP202609 二级] 直角三角形

📅 2026-09-15·✍️ OneCoder·计算中...·⏱️ 5 分钟
#GESP#C++#GESP二级#勾股定理#递推#数学函数#真题#2026年9月#GESP202609

CCF GESP 2026年9月认证(第十五次认证)C++ 二级试题,洛谷 B4575。本题严格遵循 CCF GESP 官方大纲规范,重点考察勾股定理与数列平方递推。题目逻辑严密,模型典型,是深入理解与掌握信奥核心考点的经典范例。

B4575 [luogu-B4575 [GESP202609 二级] 直角三角形]

🔗 洛谷原题传送门B4575

题目要求

题目描述

小双刚学会勾股定理,得知直角三角形的斜边的平方等于两直角边的平方和。

小双创造了直角三角形数列:数列前两项由小双指定,从第三项开始,数列中的每个数字的平方等于前两项的平方和。

例如,第一项是 3.0,第二项是 4.0,则第三项是 3.02+4.02=5.0\sqrt{3.0^2 + 4.0^2} = 5.0

小双给定了数列的前两项,并给定一个数列上限,想让你算算数列的第几项会超过小双给定的数列上限?

输入格式

输入三行,第一行一个浮点数是数列第一项,第二行一个浮点数是数列第二项,第三行一个浮点数表示数列上限。

输出格式

输出一个正整数,表示第几项开始会超过小双给定的数列上限。

输入输出样例

样例输入 #1
TEXT
3.0
4.0
10.0
样例输出 #1
TEXT
6

说明/提示

数列依次为:3.0,4.0,5.0,6.403,8.124,10.3443.0, 4.0, 5.0, \approx 6.403, \approx 8.124, \approx 10.344。第 6 项超过 10.0。 输入均为不超过 10000 的正数,第一项小于第二项。


题目分析与解题思路

  1. 数列递推模型:定义 a1,a2a_1, a_2 为初值。对于 i3i \ge 3ai=ai12+ai22a_i = \sqrt{a_{i-1}^2 + a_{i-2}^2},即 ai2=ai12+ai22a_i^2 = a_{i-1}^2 + a_{i-2}^2。这项增长本质上是斐波那契数列在平方维度的映射,增长速度非常迅猛。
  2. 终止条件与初始边界:题目保证 a1<a2a_1 < a_2。若 a1>limita_1 > \text{limit},则第 1 项即超过;若 a2>limita_2 > \text{limit},第 2 项超过;否则使用 while 循环不断计算下一项直至超过上限,记录项数并输出。
  3. C++ 标准库函数:使用 <cmath> 中的 std::sqrt() 函数,完全符合 C++11 标准。

完整参考代码 (C++11)

CPP
/**
 * Problem: luogu-B4575
 * Standard: C++11 (CCF GESP 官方大纲规范)
 * Author: OneCoder
 */

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    // 快速输入输出
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    double a, b, limit;
    if (!(cin >> a >> b >> limit)) {
        return 0;
    }

    // 特判前两项已超出上限的情况
    if (a > limit) {
        cout << 1 << "\n";
        return 0;
    }
    if (b > limit) {
        cout << 2 << "\n";
        return 0;
    }

    int step = 2;
    double prev2 = a; // 前两项中的较早一项 a_{i-2}
    double prev1 = b; // 前一项 a_{i-1}

    // 循环模拟生成后续项
    while (prev1 <= limit) {
        double next_val = sqrt(prev2 * prev2 + prev1 * prev1);
        step++;
        if (next_val > limit) {
            cout << step << "\n";
            return 0;
        }
        prev2 = prev1;
        prev1 = next_val;
    }

    cout << step << "\n";
    return 0;
}

考点归纳与备考建议

  1. 考纲匹配度:严格对标 CCF GESP 二级考纲重点,绝不超纲,注重基础算法与逻辑建模规范;
  2. 规范防范:所有代码严格以 C++11 标准编译运行,针对整数溢出、边界判断、空状态均做了详尽严整的防御性处理。
💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!