[算法]勾股数
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);
}
}
以上是关于[算法]勾股数的主要内容,如果未能解决你的问题,请参考以下文章