Fork me on GitHub

算法刷题1-勾股元组数

题目1:勾股元组数

如果三个正整数A、B、C ,A²+B²=C²则为勾股数

如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,则称其为勾股数元组

请求出给定n~m范围内所有的勾股数元组式。

输入描述

起始范围

1
2
3
4
1 < n < 10000
n < m < 10000
1
2

输出描述

ABC保证A<B<C;输出格式A B C

多组勾股数元组,按照A B C升序的排序方式输出。

若给定范围内,找不到勾股数元组时,输出Na。

关键点

  1. a b 互质,即 a 和 b 的公约数为1

概念:公约数只有1的两个数叫做互质数。根据互质数的概念可以对一组数是否互质进行判断。如:3和11的公约数只有1,则它们是互质数。

这里用阿基里德算法(辗转相除法),递归方式,如果最后结果==1,表示a,b 互质

gcd(a,b) = gcd(b, a%b)

  1. i,j,k 用穷举法得出,满足条件 i<j<k,且 i,j,k 两两互质

Java版本

参考了一个博主的Java版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class Main0001 {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
int n = scanner.nextInt();
int m = scanner.nextInt();
solution(n, m);
}
}

private static void solution(int n, int m) {
int count = 0;
for (int a = n; a < m - 1; a++) {
for (int b = a + 1; b < m; b++) {
for (int c = b + 1; c < m + 1; c++) {
if (relativelyPrime(a, b) &&
relativelyPrime(b, c) &&
relativelyPrime(a, c) &&
a * a + b * b == c * c) {
count++;
System.out.printf("%d %d %d\n", a, b, c);
}
}
}
}
if (count == 0) {
System.out.println("Na");
}
}

private static boolean relativelyPrime(int x, int y) {
if (x == y && y == 1) {
return false;
}
int min = Math.min(x, y);
for (int i = 2; i <= min; i++) {
if (x % i == 0 && y % i == 0) {
return false;
}
}
return true;
}
}

两个数是否互质

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def isPrime(x,y):
"""
作用:
判断两个数是否互质
参数:
提供两个数:x,y
返回值:
布尔值
"""
if x == y and y == 1:
return False

min_ = min(x,y)

for i in range(2, min_ + 1):
if x % i == 0 and y % i == 0: # 余数为0,说明此时i就是二者的另一个公约数(且i>=2)
return False
else:
return True
1
isPrime(1,1)
False
1
isPrime(2,9)
True
1
isPrime(3,8)
True
1
isPrime(3,15)
False

Python勾股元组数判断

个人改成Python版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def isPrime(x,y):
"""
作用:
判断两个数是否互质
参数:
提供两个数:x,y
返回值:
布尔值
"""
if x == y and y == 1:
return False

min_ = min(x,y)

for i in range(2, min_ + 1):
# 余数为0,说明此时i就是二者的另一个公约数(且i>=2)
if x % i == 0 and y % i == 0:
return False
else:
return True # for循环完之后没有满足的i,就说明二者是互质的-True


def gou_gu(m,n):
flag = False
for a in range(m, n-1):
for b in range(a+1, n):
for c in range(b+1, n+1):
if isPrime(a,b) and isPrime(a,c) and isPrime(b,c) and a**2 + b**2 == c**2:
print(f"{a}\n{b}\n{c}")
print("*" * 20)
# 只要出现了勾股数,标志位变成True
flag = True

if not flag:
print("Na")
1
gou_gu(3,9)
3
4
5
********************
1
gou_gu(3,20)
3
4
5
********************
5
12
13
********************
8
15
17
********************
1
gou_gu(8,20)
8
15
17
********************
1
gou_gu(5,20)
5
12
13
********************
8
15
17
********************

本文标题:算法刷题1-勾股元组数

发布时间:2022年08月04日 - 00:08

原始链接:http://www.renpeter.cn/2022/08/04/%E7%AE%97%E6%B3%95%E5%88%B7%E9%A2%981-%E5%8B%BE%E8%82%A1%E5%85%83%E7%BB%84%E6%95%B0.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea