gesp(C++二级)(2)洛谷:B3845:[GESP样题 二级] 勾股数

gesp(C++二级)(2)洛谷:B3845:[GESP样题 二级] 勾股数

在这里插入图片描述

题目描述

勾股数是很有趣的数学概念。如果三个正整数 a , b , c a,b,c a,

### GESP二级考试股数样题解析 #### 题目描述 股数是指满足 \(a^2 + b^2 = c^2\) 的三个正整数 \(a\), \(b\), 和 \(c\),其中 \(1 \leq a \leq b \leq c\)。对于给定的一个正整数 \(n\) (\(1 \leq n \leq 1000\)),计算有多少组股数满足 \(c \leq n\)。 #### 输入格式 输入一行,包含一个正整数 \(n\)。 #### 输出格式 输出一行,包含一个整数 \(C\),表示有 \(C\) 组满足条件的股数。 --- #### 解决方案 此问题可以通过枚举的方法解决。具体来说,可以使用三重循环分别遍历变量 \(a\), \(b\), 和 \(c\) 并验证它们是否构成股数。以下是基于 C++ 实现的一种解决方案: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n, count = 0; cin >> n; for (int a = 1; a <= n; ++a) { for (int b = a; b <= n; ++b) { // 确保 a ≤ b for (int c = b; c <= n; ++c) { // 确保 b ≤ c if (a * a + b * b == c * c) { count++; } } } } cout << count; return 0; } ``` 该方法的时间复杂度为 \(O(n^3)\),虽然可以直接解决问题,但在较大的 \(n\) 下可能会显得低效[^4]。为了提升性能,可进一步优化算法设计,例如减少不必要的迭代次数或引入数学性质进行剪枝[^5]。 --- #### 进一步优化建议 一种改进策略是利用股数的特性——已知两直角边长度后第三条斜边可通过平方根唯一确定。因此只需双重循环即可完成任务,从而显著降低时间消耗至接近线性级别\(O(n^2)\): ```cpp #include <bits/stdc++.h> using namespace std; int main(){ long long n, cnt=0; cin>>n; for(long long a=1;a<=n;a++){ for(long long b=a;b<=n;b++){//保证顺序关系成立 double c=sqrt((double)a*a+(double)b*b); if(c>=(long)c && ((long)c)*(long)c==(a*a+b*b)){ if(((long)c)<=n){ cnt++; } } } } cout<<cnt; return 0; } ``` 这种方法不仅减少了运算量还提高了执行速度,在实际应用中有更好的表现效果[^5]。 --- #### 示例说明 - **样例输入 #1**: `5` **样例输出 #1**: `1` 只有一组符合条件的股数 `(3, 4, 5)`。 - **样例输入 #2**: `13` **样例输出 #2**: `3` 符合条件的股数分别为 `(3, 4, 5)`, `(6, 8, 10)`, 和 `(5, 12, 13)`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王老师青少年编程

愿你所念皆如愿,一起加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值