파이썬 이집트 분수 계산
조회수 691회
안녕하세요, 파이썬으로 이집트 분수를 만드는 중입니다. 분수가 주어지면 가장 큰 분자가 1인 분수들로 그 분수를 표현하는것인데, 예를들면
egypt(4,5) 4/5 = 1/2 + 1/4 + 1/20 [2, 4, 20]
egypt(2,11) 2/11 = 1/6 + 1/66 [6, 66]
egypt(761, 1000) 761/1000 = 1/2 + 1/4 + 1/91 + 1/91000 [2, 4, 91, 91000]
이렇게 표현이 됩니다. 참고로, 그리디 알고리즘( greedy algorithm) 을 사용해야 하며, 나눗셈과 fraction 함수를 사용하지 않아야 합니다. 모든 계산은 정수로 해야하며 (n/d) - (1/c)를 계산하는게 핵심이라고 하는데, 나눗셈과 fraction 을 사용하지 않고 계산을 할 수 있는 법이 뭐가 있을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
자연수 나눗셈을 할 경우 항상 나누어 떨어지는 것은 아닌데, 이 경우 파이썬에서는 정확히 그 값 대신 근사한 값을 사용하기 때문에 나눗셈을 사용하면 오히려 문제가 풀리지 않을 수도 있습니다.
코드를 직접 짜보려고 했는데 거기까지는 힘들 것 같아서... 대략적인 아이디어만 드릴테니까 한번 직접 구현해보세요
1. x, y를 처음 주어진 값이라 가정
2. x/y > 1/i를 만족하는 가장 작은 i를 찾기(2부터 검사하시면 됩니다)
3. x/y - 1/i =x'/y' 를 통해 얻은 x'/y'를 새로운 x와 y로 설정
4. x가 1이 될 때까지 2와 3을 반복
대략 이런 형태면 될 것 같은데, 이 때 주의할 점은 3을 할 때 나눗셈을 사용하는 대신 우리가 직접 수학 문제를 풀듯이 양 쪽 수를 통분해서 분모와 분자를 각각 구하셔야 합니다
뺄셈을 한 후에 x와 y를 약분하셔야 하구요
이 과정을 반복해서 얻은 i값들과 마지막 y값이 이 함수에서 반환해야 하는 값이 됩니다.
대략 이런 형태면 원하는 값을 구할 수 있을 것 같은데, 디테일한 부분은 직접 구현해보세요 ㅎㅎ
-
def egypt(numerator, denominator): nr = numerator dr = denominator c = 2 fraclist = [] if nr == 1 and dr !=0: print("{}/{}").format(nr,dr) while nr != 1: if nr < dr and nr != 0 or dr != 0: if (c*nr - dr) > (dr * c): nr = c*nr - dr dr = c* dr c += 1 fraclist.append("1/{}").format(c) print("+".join(fraclist))
이렇게 짰는데 무한루프 돌아가는데 어디가 잘못됐는지 모르겠어요ㅠㅠ 답글로 코드가 안달려서 답변으로 작성합니다
-
(•́ ✖ •̀)
알 수 없는 사용자
- 예시로 보여주셨던 (4, 5) 손으로 직접 풀어보세요 의도한 대로 잘 되고 있는지. 중간중간 print문 넣어서 진행상황 확인해 보시는 것도 좋을 것 같습니다. HIAOAIH 2020.4.23 15:30
- 다른건 다 완성을 했는데 약분하는거에서 막혔어요. 혹시 새로운 함수를 디파인 하는 법 말고는 fraction쓰지 않고 약분을 하는 방법은 없나요? 알 수 없는 사용자 2020.4.23 15:51
- math 모듈에 최대공약수를 구하는 함수가 있고 그게 아니라면 직접 구현하셔도 되는데, 나눗셈을 쓰지 말라는 조건에 %도 포함이 되는건지, 모든 구간에서 다 사용하면 안되는건지 등 세부적인 조건을 몰라서 더 자세한 말씀을 드리기는 어렵겠네요.. 일단 최대공약수 구하는 방법부터 찾아보시고 문제에 주어진 조건에 부합하지 않는 부분이 있는지 잘 살펴보세요 HIAOAIH 2020.4.23 16:01
- 기약분수가 아닐 때에는 nr != 1 이란 조건이 유효하지 않아요. nowp 2020.4.23 16:03
-
댓글 입력