码迷,mamicode.com
首页 > 编程语言 > 详细

[算法]勾股数

时间:2019-11-17 14:36:06      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:bool   math   变量   pre   利用   判断   算法   复杂   double   

勾股数

问题描述

所谓勾股数,一般是指能够构成直角三角形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 \n", a, b, (int)c);
                }
            }
    }

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

}

[算法]勾股数

标签:bool   math   变量   pre   利用   判断   算法   复杂   double   

原文地址:https://www.cnblogs.com/Rowry/p/11876017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!