[算法]勾股数

Posted rowry

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]勾股数相关的知识,希望对你有一定的参考价值。

勾股数

问题描述

所谓勾股数,一般是指能够构成直角三角形3条边的3个正整数(a,b,c)
即 a^2 + b^2 = c^2 (a,b,c) => 为自然数
求1000以内的勾股数

算法思路

  • 这个问题本身是不难的,3个变量,只需要进行3重循环嵌套遍历即可
  • c = sqrt(a^2 + b^2) => 主要是判断能不能被整除
    • 就是判断c这个浮点数和整数相等相等
  • 利用数量关系来减少一重循环
    • 可以利用 c = sqrt(a^2 + b^2) 减少第三重循环,这样使时间复杂度降低(数据量大的时候差距明显)
    • 求10000以内的勾股数,三重循环要跑好一阵子

代码示例

Python

# 求1000以内的勾股数
import math


def fn(num):
    """求num之内的勾股数"""
    for a in range(1, num):
        # 这里b从 a+1开始是为了避免重复
        for b in range(a+1, num):
            c = math.sqrt(a ** 2 + b ** 2)
            if c.is_integer() and c < num:
                print("a:%s,b:%s,c:%d" % (a,b,c))

fn(1000)

Java


public class 勾股数 {

    static boolean isInteger(double num) {
        return (int) num == num;
    }

    // 找出num之内的勾股数
    static void fn(int num) {
        for (int a = 1; a < num; a++)
            for (int b = a + 1; b < num; b++) {
                double c = Math.sqrt(a * a + b * b);
                if (isInteger(c) && c < num) {
                    System.out.printf("a:%d,b:%d,c:%d 
", a, b, (int)c);
                }
            }
    }

    public static void main(String[] args) {
        fn(1000);
    }

}

以上是关于[算法]勾股数的主要内容,如果未能解决你的问题,请参考以下文章

[算法]勾股数

华为OD机试题,用 Java 解勾股数元组问题

华为OD机试真题Java实现勾股数元组真题+解题思路+代码(2022&2023)

打卡 c语言趣味编程 求勾股数

50以内的勾股数

求50以内的所有勾股数