[PYTHON] 파이썬 프라임 번호 검사기 [duplicate]
PYTHON파이썬 프라임 번호 검사기 [duplicate]
나는 입력 된 숫자를 취할 프로그램을 작성하고 그것이 소수인지 점검하고 확인하려고 노력 해왔다. 숫자가 실제로 소수라면 제가 만든 코드가 완벽하게 작동합니다. 숫자가 소수가 아닌 경우 이상하게 작동합니다. 누군가 코드에 어떤 문제가 있는지 말할 수 있는지 궁금합니다.
a=2
num=13
while num > a :
if num%a==0 & a!=num:
print('not prime')
a=a+1
else:
print('prime')
a=(num)+1
24가 입력 될 때 주어진 결과는 다음과 같습니다. 프라임하지 마라. 프라임하지 마라. 프라임하지 마라. 초기
어떻게 모든 이상한에 대한보고 프라임과 오류를 해결하고 심지어 모든 프라임되지 않습니다
해결법
-
==============================
1.숫자가 소수가 아닌 것을 알고 나면 반복을 중지해야합니다. while 루프를 종료하려면 소수를 찾으면 휴식을 추가하십시오.
숫자가 소수가 아닌 것을 알고 나면 반복을 중지해야합니다. while 루프를 종료하려면 소수를 찾으면 휴식을 추가하십시오.
코드가 변경되도록 최소한의 변경 만하면됩니다.
a=2 num=13 while num > a : if num%a==0 & a!=num: print('not prime') break i += 1 else: # loop not exited via break print('prime')
귀하의 알고리즘은 다음과 같습니다 :
for a in range(a, num): if a % num == 0: print('not prime') break else: # loop not exited via break print('prime')
함수에 던져 넣으면 break와 for-else를 없앨 수 있습니다 :
def is_prime(n): for i in range(3, n): if n % i == 0: return False return True
이런 식으로 프라임에 대해 무차별 대입을 수행한다고해도 n의 제곱근까지만 반복하면됩니다. 또한 짝수를 두 번 테스트하지 않고 건너 뛸 수 있습니다.
제안 사항 :
import math def is_prime(n): if n % 2 == 0 and n > 2: return False for i in range(3, int(math.sqrt(n)) + 1, 2): if n % i == 0: return False return True
이 코드는 0, 1 및 음수를 올바르게 처리하지 않습니다.
for 루프를 대체하기 위해 생성기 표현식을 사용하여 all을 사용하면 더 간단 해집니다.
import math def is_prime(n): if n % 2 == 0 and n > 2: return False return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
-
==============================
2.
def isprime(n): '''check if integer n is a prime''' # make sure n is a positive integer n = abs(int(n)) # 0 and 1 are not primes if n < 2: return False # 2 is the only even prime number if n == 2: return True # all other even numbers are not primes if not n & 1: return False # range starts with 3 and only needs to go up # the square root of n for all odd numbers for x in range(3, int(n**0.5) + 1, 2): if n % x == 0: return False return True
취한 것 :
-
==============================
3.코드의 두 가지 주요 문제점은 다음과 같습니다.
코드의 두 가지 주요 문제점은 다음과 같습니다.
몇 가지 매우 비효율적 인 비효율 :
-
==============================
4.
def is_prime(n): return all(n%j for j in xrange(2, int(n**0.5)+1)) and n>1
-
==============================
5.이 예제는 reduce ()를 사용하지만 속도를 늦 춥니 다.
이 예제는 reduce ()를 사용하지만 속도를 늦 춥니 다.
def makepnl(pnl, n): for p in pnl: if n % p == 0: return pnl pnl.append(n) return pnl def isprime(n): return True if n == reduce(makepnl, range(3, n + 1, 2), [2])[-1] else False for i in range(20): print i, isprime(i)
Sieve Of Atkin을 사용합니다.
def atkin(limit): if limit > 2: yield 2 if limit > 3: yield 3 import math is_prime = [False] * (limit + 1) for x in range(1,int(math.sqrt(limit))+1): for y in range(1,int(math.sqrt(limit))+1): n = 4*x**2 + y**2 if n<=limit and (n%12==1 or n%12==5): # print "1st if" is_prime[n] = not is_prime[n] n = 3*x**2+y**2 if n<= limit and n%12==7: # print "Second if" is_prime[n] = not is_prime[n] n = 3*x**2 - y**2 if x>y and n<=limit and n%12==11: # print "third if" is_prime[n] = not is_prime[n] for n in range(5,int(math.sqrt(limit))): if is_prime[n]: for k in range(n**2,limit+1,n**2): is_prime[k] = False for n in range(5,limit): if is_prime[n]: yield n def isprime(n): r = list(atkin(n+1)) if not r: return False return True if n == r[-1] else False for i in range(20): print i, isprime(i)
-
==============================
6.문제는 이미 "마음을 굳혔다"고 생각하더라도 루프가 계속 실행된다는 것입니다. a = a + 1 뒤에 줄 바꿈을 추가해야합니다.
문제는 이미 "마음을 굳혔다"고 생각하더라도 루프가 계속 실행된다는 것입니다. a = a + 1 뒤에 줄 바꿈을 추가해야합니다.
-
==============================
7.초급 여기, 그래서 만약 내가 방법입니다 알려주지 만, 나는 이런 식으로 할거야 :
초급 여기, 그래서 만약 내가 방법입니다 알려주지 만, 나는 이런 식으로 할거야 :
def prime(n): count = 0 for i in range(1, (n+1)): if n % i == 0: count += 1 if count > 2: print "Not a prime" else: print "A prime"
-
==============================
8.숫자가 복합 (소수가 아님)이라고 판단되면 작업이 완료됩니다. 반복을 사용하여 루프를 종료 할 수 있습니다.
숫자가 복합 (소수가 아님)이라고 판단되면 작업이 완료됩니다. 반복을 사용하여 루프를 종료 할 수 있습니다.
while num > a : if num%a==0 & a!=num: print('not prime') break # not going to update a, going to quit instead else: print('prime') a=(num)+1
또한 파이썬의 일부 구문에 더 익숙해 지도록 노력할 수도 있습니다. 루프가 한 줄짜리로 단축되어 여전히 제 의견으로는 잘 읽힐 수 있습니다.
any(num % a == 0 for a in range(2, num))
-
==============================
9.이것은 일을 할 것입니다 :
이것은 일을 할 것입니다 :
number=int(raw_input("Enter a number to see if its prime:")) if number <= 1: print "number is not prime" else: a=2 check = True while a != number: if number%a == 0: print "Number is not prime" check = False break a+=1 if check == True: print "Number is prime"
-
==============================
10.
a=input("Enter number:") def isprime(): total=0 factors=(1,a)# The only factors of a number pfactors=range(1,a+1) #considering all possible factors if a==1 or a==0:# One and Zero are not prime numbers print "%d is NOT prime"%a elif a==2: # Two is the only even prime number print "%d is prime"%a elif a%2==0:#Any even number is not prime except two print "%d is NOT prime"%a else:#a number is prime if its multiples are 1 and itself #The sum of the number that return zero moduli should be equal to the "only" factors for number in pfactors: if (a%number)==0: total+=number if total!=sum(factors): print "%d is NOT prime"%a else: print "%d is prime"%a isprime()
-
==============================
11.이는 요인을 추적한다는 점에서 약간의 차이가 있습니다.
이는 요인을 추적한다는 점에서 약간의 차이가 있습니다.
def prime(a): list=[] x=2 b=True while x<a: if a%x==0: b=False list.append(x) x+=1 if b==False: print "Not Prime" print list else: print "Prime"
-
==============================
12.
max=int(input("Find primes upto what numbers?")) primeList=[] for x in range(2,max+1): isPrime=True for y in range(2,int(x**0.5)+1) : if x%y==0: isPrime=False break if isPrime: primeList.append(x) print(primeList)
-
==============================
13.
def is_prime(x): if x < 2: return False else: if x == 2: return True else: for i in range(2, x): if x % i == 0: return False return True x = int(raw_input("enter a prime number")) print is_prime(x)
-
==============================
14.#는 소수입니다. 우리는 볼 것이다 (코더 : 치카 크)
#는 소수입니다. 우리는 볼 것이다 (코더 : 치카 크)
def is_prime (x) : flag = False x <2 인 경우 : False를 반환합니다. 그밖에: 범위 (2, x)의 카운트 : if x % count == 0 : flag = True 단절 if flag == True : False를 반환합니다. True를 돌려 준다.
from https://stackoverflow.com/questions/18833759/python-prime-number-checker by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] NaN 값을 어떻게 확인할 수 있습니까? (0) | 2018.10.08 |
---|---|
[PYTHON] datetime.isocalendar ()의 역함수를 찾는 가장 좋은 방법은 무엇입니까? (0) | 2018.10.08 |
[PYTHON] 가장 길게 증가하는 서브 시퀀스 (0) | 2018.10.08 |
[PYTHON] 양식 전송 오류, 플라스크 (0) | 2018.10.08 |
[PYTHON] python selenium 버튼을 클릭하십시오. (0) | 2018.10.08 |