文章

【GESP】C++二级真题 luogu-B4356 [GESP202506 二级] 数三角形

GESP C++二级,2025年6月真题,多重循环,难度★✮☆☆☆。

luogu-B4356 [GESP202506 二级] 数三角形

题目要求

题目描述

直角三角形有两条直角边与一条斜边,设两条直角边的长度分别为 $a, b$,则直角三角形的面积为 $\frac{ab}{2}$。

请你计算当直角边长 $a, b$ 均取不超过 $n$ 的正整数时,有多少个不同的面积为整数的直角三角形。直角边长分别为 $a, b$ 和 $a’, b’$ 的两个直角三角形相同,当且仅当 $a = a’$, $b = b’$ 或者 $a = b’$, $b = a’$。

输入格式

一行,一个整数 $n$,表示直角边长的最大值。

输出格式

输出一行,一个整数,表示不同的直角三角形数量。

输入输出样例 #1

输入 #1

1
3

输出 #1

1
3

输入输出样例 #2

输入 #2

1
5

输出 #2

1
9

说明/提示

对于所有测试点,保证 $1 \leq n \leq 1000$。


题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:
    • 输入一个整数 $n$,表示直角边长的最大值
    • 需要计算有多少个不同的、面积为整数的直角三角形
  2. 解题关键:
    • 核心思路 - 枚举与计数:
      1. 遍历所有可能的直角边长组合:
        • 第一条边 $a$ 的范围是 $[1,n]$
        • 第二条边 $b$ 的范围是 $[a,n]$(从 $a$ 开始避免重复计数)
      2. 判断面积是否为整数:
        • 面积公式:$\frac{a \times b}{2}$
        • 当且仅当 $a \times b$ 为偶数时,面积为整数
  3. 复杂度分析:
    • 时间复杂度:$O(n^2)$,需要双重循环遍历所有可能的边长组合
    • 空间复杂度:$O(1)$,只需要存储几个整数变量


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>

int main() {
    // 读入直角边长的最大值n
    int n;
    std::cin >> n;
    
    // 计数器,记录满足条件的直角三角形数量
    int count = 0;
    
    // 遍历所有可能的直角边长组合
    for (int i = 1; i <= n; i++) {
        // j从i开始避免重复计数
        for (int j = i; j <= n; j++) {
            // 判断面积是否为整数:面积 = (i*j)/2
            if (i * j % 2 == 0) {
                count++;
            }
        }
    }
    
    // 输出结果
    std::cout << count << std::endl;
    return 0;
}         

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY 4.0 进行授权