Euler: Integer right triangles
3606 ワード
If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120. {20,48,52}, {24,45,51}, {30,40,50}
pは3辺の長さが整数の直角三角形の周長であり、p=120の場合、3種類の直角三角形が存在する.それぞれ:{20,48,52},{24,45,51},{30,40,50}
For which value of p ≤ 1000, is the number of solutions maximised?
pの範囲は1000以内に限定されていますが、pがどれだけの場合、最も多くの場合の直角三角形を持っていますか?
構想:p整数から3つの数x,y,zを取り出し、x>y>zかつx+y+z=pとする.そしてy+z>xを満たす.
pは3辺の長さが整数の直角三角形の周長であり、p=120の場合、3種類の直角三角形が存在する.それぞれ:{20,48,52},{24,45,51},{30,40,50}
For which value of p ≤ 1000, is the number of solutions maximised?
pの範囲は1000以内に限定されていますが、pがどれだけの場合、最も多くの場合の直角三角形を持っていますか?
構想:p整数から3つの数x,y,zを取り出し、x>y>zかつx+y+z=pとする.そしてy+z>xを満たす.
def isRight(x,y,z):
if not(x>=y and y >= z):
print "should be x>y>z!", str(x),str(y),str(z)
return False
if x*x == y*y + z*z:
return True
return False
def getnum(p):
if p<3 or p>1000:
print 'Wrong p'
return
count = 0
for x in range(p/3, p/2):
for y in range((p-x)/2, (p-x)):
if x<y:
break
z = p-x-y
if y<z:
continue
#print "x,y,z=",str(x),str(y),str(z)
if isRight(x,y,z):
print "x,y,z=",str(x),str(y),str(z)
count += 1
print "count for p is ", str(count)
return p,count
def main():
#getnum(120)
maxcount = 1
maxp = 1
for i in range(3, 1001):
tmp_p,tmp_count = getnum(i)
if tmp_count > maxcount:
maxcount = tmp_count
maxp = tmp_p
print maxp, maxcount
if __name__ == "__main__":
main()