根据“勾股数”定义,所求三角形三边应满足条件
a
2
+
b
2
=
c
2
a^2+b^2=c^2
a2+b2=c2。可以在所求范围内利用穷举法找出满足条件的数。
3.算法分析
采用穷举法求解时最容易想到的一种方法是利用三个循环语句分别控制变量a、b、c的取值范围,第一层控制变量a,取值范围是1~100;在a值确定的情况下再确定b值,即第二层控制变量b,为了避免结果有重复现象,b的取值范围是(a+1)~100;a、b的值已确定,利用穷举法在(b+1)~100范围内一个一个地去比较,看当前c值是否满足条件
a
2
+
b
2
=
c
2
a^2+b^2=c^2
a2+b2=c2,若满足,则输出当前a、b、c的值,否则继续寻找。主要代码如下:
for a inrange(1,101):# 确定a的取值for b inrange(a+1,101):# 确定b的取值for c inrange(b+1,101):# 确定c的取值if a*a + b*b == c*c:# 判断三个变量是否满足勾股数条件print("%4d %4d %4d\t |"%(a, b, c), end="")
但是上述算法的效率比较低,根据
a
2
+
b
2
=
c
2
a^2+b^2=c^2
a2+b2=c2这一条件,在a、b值确定的情况下没必要再利用循环一个一个去寻找c值。若a、b、c是一组勾股数,则
a
2
+
b
2
a^2+b^2
a2+b2的平方根一定等于c,c的平方应该等于a、b的平方和,故可将
a
2
+
b
2
a^2+b^2
a2+b2的平方根赋给c,再判断c的平方是否等于
a
2
+
b
2
a^2+b^2
a2+b2。根据“勾股数”定义将变量定义为整型,
a
2
+
b
2
a^2+b^2
a2+b2的平方根不一定为整数,但变量c的类型为整型,将一个实数赋给一个整型变量时可将实数强制转换为整型(舍弃小数点之后的部分),然后再赋值,这种情况下得到的c的平方与原来的
a
2
+
b
2
a^2+b^2
a2+b2的值肯定不相等。故可利用这一条件进行判断。
4.完整的程序
%%time
# 勾股数 a**2+b**2=c**2import math
if __name__ =="__main__":
count =0print("100以内的勾股数有:")# a,b,c分别表示三角形的三条边# 满足勾股数的三个数组成的三角形一定是直角三角形print(" a\tb\tc a \t b \tc \t a \t b\tc \t a\t b\tc");# 求100以内的勾股数for a inrange(1,101):for b inrange(a+1,101):# 邻边不能相等,否则就是等边三角形了
c =int(math.sqrt(a*a + b*b))# 求c值,并转换为整型# 判断c的平方是否等于a*a + b*b ,且两边之和大于第三边if c*c ==(a*a + b*b)and(a + b > c)and(a + c > b)and(b + c > a)and c <=100:print("%4d %4d %4d\t |"%(a, b, c), end="")
count +=1if count %4==0:print()
所以如果只想得到互质的数组,该方法可以改成对于a=4n(n≥2),b=
4
n
2
−
1
4n^2-1
4n2−1,c=
4
n
2
+
1
4n^2+1
4n2+1,例如:
·n=2时(a,b,c)=(8,15,17)
·n=3时(a,b,c)=(12,35,37)
·n=4时(a,b,c)=(16,63,65)
……
代码如下:
%%time
# 互质勾股数if __name__ =="__main__":
a =int(input("请输入一个a值:"))print(f'输入a的值为:{a}')if a >=3and a %2==1:# 输入的a为奇数,则a = 2n+1, b=2n**2+2n, c=2n**2+2n+1
n =(a -1)//2
b =2* n**2+2*n
c =2* n**2+2*n +1print("%d %d %d\n"%(a,b,c))else:if a >=3and a %2==0:# 输入的a为偶数,则a = 2n, b=n**2-1, c=n**2+1
n = a //2
b = n**2-1
c = n**2+1print("%d %d %d\n"%(a, b, c))else:print("error")
输入a的值为:101
101 5100 5101
CPU times: user 11.9 ms, sys: 10.7 ms, total: 22.6 ms
Wall time: 2.26 s