#!/usr/bin/python
import sys,math
n = input("enter a number to find the factors : ")
j,flag,b= 0l,False,0l
for b in xrange(1,n+1):
a = n + (b*b)
j = long(math.sqrt(a))
if a == j*j:
flag = True
break
if flag:
c = j+b
d = j-b
print "the first factor is : ",c ," and the second factor is : ",d
이 코드를 실행할 때 다른 입력에 대해 다른 유형의 오류가 발생합니다. 다음OverflowError 파이썬 int가 너무 커서 C로 변환 할 수 없습니다.
는이 제 2 입력
[email protected]:~$ ./fermat.py
enter a number to find the factors : 28888888888888888888888888888888888444444444444444444444444
Traceback (most recent call last):
File "./fermat.py", line 8, in <module>
for b in range(1,n+1):
OverflowError: range() result has too many items
위한 입력
[email protected]:~$ ./fermat.py
enter a number to find the factors : 544564564545456
Traceback (most recent call last):
File "./fermat.py", line 8, in <module>
for b in range(1,n+1):
MemoryError
의 한 종류이고,이 제 3 출력
[email protected]:~$ ./fermat.py
enter a number to find the factors : 28888888888888888888888888888888888444444444444444444444444
Traceback (most recent call last):
File "./fermat.py", line 8, in <module>
for b in xrange(1,n+1):
OverflowError: Python int too large to convert to C long
사실
I가 코드를 작성 하였다위한 Fermat 인수 분해를 통해 주어진 수의 인자들을 찾는다. 그리고 나의 요구 사항은 백개의 숫자를 입력으로 주더라도 입력 번호에 대한 출력을 제공해야합니다.
이런 종류의 문제를 해결할 수있는 방법이 있습니까? 파이썬 2.7.5 이상에서 우분투를 사용하고 있습니다.
처음 두 개의 추적 표시는 게시하지 않은 코드를 나타냅니다. 당신은'xrange()'대신에'range()'를 사용하여 너무 많은 원소를 가진리스트를 생성했습니다. 어쨌든 그러한 엄청난 요인에 대한 루프를 만들어서는 안됩니다. 어쨌든 * 적당한 시간 내에 코드가 완료되지 않습니다. –
[Fermat 's factorization algorithm] (https://en.wikipedia.org/wiki/Fermat's_factorization_method)에서 이러한 루프를 만들 필요가 있음을 알 수 있습니까? –
짝수에 대해 Fermat 인수 분해를 사용할 수 없습니다. – user2357112