2025年6月GESP(C++二级): 数三角形 - 实践
2025年6月GESP(C++二级): 数三角形

题目描述
直角三角形有两条直角边与一条斜边,设两条直角边的长度分别为 a , b a, b a,b,则直角三角形的面积为 a b 2 \frac{ab}{2} 2ab。
请你计算当直角边长 a , b a, b a,b 均取不超过 n n n 的正整数时,有多少个不同的面积为整数的直角三角形。直角边长分别为 a , b a, b a,b 和 a ′ , b ′ a', b' a′,b′ 的两个直角三角形相同,当且仅当 a = a ′ a = a' a=a′, b = b ′ b = b' b=b′ 或者 a = b ′ a = b' a=b′, b = a ′ b = a' b=a′。
输入格式
一行,一个整数 n n n,表示直角边长的最大值。
输出格式
输出一行,一个整数,表示不同的直角三角形数量。
输入输出样例 #1
输入 #1
3
输出 #1
3
输入输出样例 #2
输入 #2
5
输出 #2
9
说明/提示
对于所有测试点,保证 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000。
以下是针对题目要求编写的C++代码,用于计算在给定直角边长最大值n的情况下,不同直角三角形的数量(要求面积为整数且避免重复计数)。代码使用双重循环遍历所有可能的直角边组合,并通过条件判断确保计数满足面积整数条件。
AC代码
#include<bits/stdc++.h>
// 包含标准库头文件
using namespace std;
int n, cnt = 0;
// 定义变量:n为直角边长的最大值,cnt用于计数符合条件的三角形数量
int main(){
cin >> n;
// 读取输入的n值
// 外层循环遍历第一条直角边a(从1到n)
for(int a = 1; a <= n; a++) {
// 内层循环遍历第二条直角边b(从a到n,确保a<=b避免重复计数)
for(int b = a; b <= n; b++) {
// 判断条件:两条直角边的乘积是否为偶数
// 若a*b为偶数,则面积ab/2为整数
if((a * b) % 2 == 0) {
cnt++;
// 满足条件,计数器加1
}
}
}
cout << cnt;
// 输出符合条件的直角三角形数量
return 0;
// 程序正常结束
}
功能分析
问题理解:
- 题目要求计算直角边长
a和b(均不超过整数n)组成的直角三角形中,面积为整数的不同三角形数量。 - 三角形被视为相同当且仅当
(a, b)与(a', b')相同或对称(即(a,b)与(b,a)视为同一个三角形)。
- 题目要求计算直角边长
避免重复计数:
- 通过内层循环变量
b从a开始(而不是从1开始),确保只考虑a <= b的情况,从而避免对称重复。
- 通过内层循环变量
面积整数条件:
- 直角三角形面积为
(a * b) / 2,要使其为整数,需满足a * b是偶数(即至少有一条直角边为偶数)。 - 使用条件
(a * b) % 2 == 0判断乘积是否为偶数。
- 直角三角形面积为
循环逻辑:
- 外层循环:遍历所有可能的直角边
a(1 到n)。 - 内层循环:对于每个
a,遍历所有满足b >= a且b <= n的边b。 - 条件检查:对每组
(a, b)检查面积是否为整数,满足则计数。
- 外层循环:遍历所有可能的直角边
复杂度:
- 时间复杂度为 O(n²),由于题目约束
n <= 1000,最大循环次数为 10⁶,在合理范围内。 - 空间复杂度为 O(1),仅使用固定数量的变量。
- 时间复杂度为 O(n²),由于题目约束
示例验证
输入 n=3:
- 有效组合:
(1,2),(2,2),(2,3)(面积分别为1、2、3,均为整数)。 - 输出
cnt=3,符合样例。
- 有效组合:
输入 n=5:
- 有效组合:
(1,2),(1,4),(2,2),(2,3),(2,4),(2,5),(3,4),(4,4),(4,5)。 - 输出
cnt=9,符合样例。
- 有效组合:
文末彩蛋:
点击查看老师的个人主页,学习csp信奥赛完整系列课程:
https://edu.csdn.net/lecturer/7901


浙公网安备 33010602011771号