반응형
50, 50 격자 안에서 한 꼭지점이 원점에 있고, 꼭지점이 격자점에 위치하는 직각삼각형의 갯수 구하기. 오일러 프로젝트 91번 문제이다. 직각이 원점에 있는 경우, 직각이 축에 위치하는 경우, 그리고 나머지 경우에 대해 나누어 갯수를 구했다.
#!/usr/bin/env python
# http://projecteuler.net/index.php?section=problems&id=91
def get_cnt_when_right_angle_is_O(max):
''' P is (0, [1 ... max]) and Q is ([1 ... max], 0)'''
return max * max
def get_cnt_when_right_angle_is_on_axis(max):
''' When P is (0, y), Q is ([1 ... max], y).
When Q is (x, 0), P is (x, [1 ... max]).'''
return max*max + max*max
def gcd(a, b):
if a > b :
min, max = b, a
else:
min, max = a, b
while max%min != 0:
min, max = max%min, min
return min
def get_cnt_when_right_angle_on(x, y, max):
g = gcd(x, y)
u1 = [ y/g, -x/g ]
#print(u1)
cnt1 = 0
while max >= x + (cnt1+1)*u1[0] and x + (cnt1+1)*u1[0] >= 0 and max >= y + (cnt1+1)*u1[1] and y + (cnt1+1)*u1[1] >= 0:
#print(cnt1, x+(cnt1+1)*u1[0], y+(cnt1+1)*u1[1])
cnt1+=1
u2 = [ -u1[0], -u1[1] ]
#print(u2)
cnt2 = 0
while max >= x + (cnt2+1)*u2[0] and x + (cnt2+1)*u2[0] >= 0 and max >= y + (cnt2+1)*u2[1] and y + (cnt2+1)*u2[1] >= 0:
#print(cnt2, x+(cnt2+1)*u2[0], y+(cnt2+1)*u2[1])
cnt2+=1
return cnt1 + cnt2
MAX=50
count = 0
count += get_cnt_when_right_angle_is_O(MAX)
print(count)
count += get_cnt_when_right_angle_is_on_axis(MAX)
print(count)
for x in range(1, MAX+1):
for y in range(1, MAX+1):
c = get_cnt_when_right_angle_on(x, y, MAX)
if c != 0:
print(x, y, c)
count += c
print(count)
728x90
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[Euler Project 188] 1777의 1885 거듭거듭제곱의 마지막 8자리 구하기 (0) | 2009.07.26 |
---|---|
[Euler Project 187] 인자가 두개인 합성수의 갯수 (0) | 2009.07.26 |
[수학] 페르마 소정리 이해를 위한 장난 (0) | 2009.07.07 |
[Project Euler 213] 30x30 격자 벼룩 (0) | 2009.02.18 |
[Projet Euler 231] 조합의 소인수분해 (0) | 2009.02.13 |