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 1n1000

以下是针对题目要求编写的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;
  // 程序正常结束
  }

功能分析

  1. 问题理解

    • 题目要求计算直角边长 ab(均不超过整数 n)组成的直角三角形中,面积为整数的不同三角形数量。
    • 三角形被视为相同当且仅当 (a, b)(a', b') 相同或对称(即 (a,b)(b,a) 视为同一个三角形)。
  2. 避免重复计数

    • 通过内层循环变量 ba 开始(而不是从1开始),确保只考虑 a <= b 的情况,从而避免对称重复。
  3. 面积整数条件

    • 直角三角形面积为 (a * b) / 2,要使其为整数,需满足 a * b 是偶数(即至少有一条直角边为偶数)。
    • 使用条件 (a * b) % 2 == 0 判断乘积是否为偶数。
  4. 循环逻辑

    • 外层循环:遍历所有可能的直角边 a(1 到 n)。
    • 内层循环:对于每个 a,遍历所有满足 b >= ab <= n 的边 b
    • 条件检查:对每组 (a, b) 检查面积是否为整数,满足则计数。
  5. 复杂度

    • 时间复杂度为 O(n²),由于题目约束 n <= 1000,最大循环次数为 10⁶,在合理范围内。
    • 空间复杂度为 O(1),仅使用固定数量的变量。

示例验证

  • 输入 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

在这里插入图片描述

posted @ 2025-07-29 13:30  wzzkaifa  阅读(10)  评论(0)    收藏  举报