주어진 정수의 소인수를 반환하는 함수를 작성했습니다. 내가 테스트 한 케이스의 경우 제대로 작동하는 것 같습니다. 다음은 원래 기능입니다.
def prime_factors_2(num: int) -> set:
factors = []
while num % 2 == 0:
factors.append(2)
num //= 2
i = 3
while i <= int(sqrt(num)) + 1:
if num % i == 0:
factors.append(i)
num //= i
else:
i += 2
if num != 1:
factors.append(num)
return set(factors)
# num = 867844
# Output = {601, 2, 19}
코드를 엉망으로 만들면서 동일한 구현을 시도했지만 while 루프 대신 for 루프를 사용했습니다 (카운팅이 관련 될 때 for 루프를 사용하는 것을 선호하므로). 두 번째 함수의 코드입니다.
def prime_factors_1(num: int) -> set:
factors = []
while num % 2 == 0:
factors.append(2)
num //= 2
for i in range(3, int(sqrt(num)) + 1, 2):
if num % i == 0:
factors.append(i)
num //= i
print(num)
if num != 1:
factors.append(num)
return set(factors)
# num = 867844
# Output = {2, 19, 11419}
어떤 이유로 더 이상 11419를 601과 19로 고려하지 않습니다. 두 루프가 동일하지 않습니까? 아니면 while 루프를 for 루프로 변환하는 동안 실수를하고 있습니까? 이 경우 두 루프 사이에 실질적인 차이가 없다는 것을 알고 있지만 순수한 호기심에서 이것을 알고 싶습니다.
문제는 "while 루프"에서 "if"조건이 충족되지 않을 때만 "i"값을 2 씩 증가시키고 "for 루프"의 경우 i가 각각 2 씩 증가한다는 것입니다. 되풀이.
따라서 다음과 같이한다면 :
while i <= int(sqrt(num)) + 1:
if num % i == 0:
factors.append(i)
num //= i
i += 2
그런 다음 prime_factors_2 함수는 prime_factors_1 함수와 동일한 답을 반환합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다