返回 课程

信奥AC之路-2级

0% 完成
0/0 步骤
  1. 第一课:字符
    5 主题|小节
  2. 第二课 嵌套循环与矩形图案(一)
    4 主题|小节
  3. 第三课 嵌套循环与矩形图案(二)
    3 主题|小节
  4. 第四课:矩形三
    5 主题|小节
  5. 第五课:字符矩形
    7 主题|小节
  6. 第六课:直角三角形
    6 主题|小节
  7. 第七课:倒三角形
    7 主题|小节
  8. 第八课:字符三角形
    8 主题|小节
  9. 第九课:字符倒三角形
    7 主题|小节
  10. 第十课:平行四边形
    6 主题|小节
  11. 第十一课:字符直角三角形
    5 主题|小节
  12. 第十二课:左斜三角形
    6 主题|小节
  13. 第十三课:等腰三角形
    6 主题|小节
  14. 第十四课:倒置等腰三角形
    7 主题|小节
  15. 第十五课:上下对称图形
    4 主题|小节
  16. 第十六课:复杂对称图形
    5 主题|小节
  17. 第十七课:左右对称图形
    5 主题|小节
  18. 第十八课:空心图形
    5 主题|小节
  19. 第十九课:空心图形
    3 主题|小节
  20. 第二十课:嵌套应用
    4 主题|小节
  21. 第二十一课:嵌套应用二
    4 主题|小节
  22. 第二十二课:嵌套应用三
    3 主题|小节
  23. 第二十三课:嵌套应用四
    3 主题|小节
课 21, 主题|小节 3
进行中

21.3 数学问题的嵌套循环解法

2026年1月16日
课 进展
0% 完成

“嵌套循环在解决数学问题时非常有用,”我继续解释道,”尤其是在需要遍历多个变量的组合时,嵌套循环能够系统地探索所有可能性。”

21.3.1 勾股数

题目描述:勾股数是很有趣的数学概念。如果三个正整数a,b,c,满足a²+b²=c²,而且1≤a≤b≤c,我们就将a,b,c组成的三元组(a,b,c)称为勾股数。你能通过编程,数数有多少组勾股数,能够满足c≤n吗?

样例输入

20

样例输出

3

代码实现(方法一:三重循环)

#include <iostream>
using namespace std;

int main() {
    int n, cnt = 0;  // n为上限值,cnt为满足条件的勾股数组数
    cin >> n;
    for(int a = 1; a <= n; a++) {  // 遍历可能的a值
        for(int b = a; b <= n; b++) {  // 遍历可能的b值,保证b>=a
            for(int c = b; c <= n; c++) {  // 遍历可能的c值,保证c>=b
                if(a*a + b*b == c*c) {  // 检查是否满足勾股定理
                    cnt++;  // 如果满足,计数器加1
                }
            }
        }
    }
    cout << cnt;  // 输出满足条件的组数
    return 0;
}

代码实现(方法二:优化解法)

#include <iostream>
#include <cmath>  // 包含sqrt函数所需的头文件
using namespace std;

int main() {
    int n, cnt = 0;  // n为上限值,cnt为满足条件的勾股数组数
    cin >> n;
    for(int a = 1; a <= n; a++) {  // 遍历可能的a值
        for(int b = a; b <= n; b++) {  // 遍历可能的b值,保证b>=a
            int c = sqrt(a*a + b*b);  // 根据勾股定理计算可能的c值
            bool f1 = c*c == a*a + b*b;  // 检查c是否为整数(通过平方后是否相等判断)
            bool f2 = c <= n;  // 检查c是否不超过上限n
            if(f1 && f2) {  // 如果同时满足两个条件
                cnt++;  // 计数器加1
            }
        }
    }
    cout << cnt;  // 输出满足条件的组数
    return 0;
}

思考

  • 方法一使用三重循环,时间复杂度为O(n³)
  • 方法二只使用两重循环,时间复杂度为O(n²)
  • 方法二利用了勾股定理计算c值,大大减少了循环次数
  • 注意使用sqrt函数需要包含cmath头文件