1

素数についてはすでにたくさんの質問がありますが、コードは要求しません。私はただ知りたいのですが、私の何が悪いのか(コメントがあなたが理解するのに役立つことを願っています、私がしていること):

from math import ceil

def isPrimeNumber (n, out='short'): #Checks, whether n is a prime number
    answer = 'Yes'
    for p in range(2, int(ceil(n**0.5))+1): #Checks all numbers lower than 
                                            #SQRT(n), if they are divisors of n
        if n%p == 0:    #If p is a divisor, n isn't prime
            answer = 'No'  
            if out == 'verbose':
                print 'Least divisor is', p
            return False
            break
    if answer == 'Yes': #If there isn't a p, that is a divisor, n is prime
        if out == 'verbose':
            print 'No divisors except for 1 and', str(n)+'!'
        return True   

def primeNumbers (start = 1, stop = 1000, numbers = 0):
    N = stop
    if numbers == 0: #Calculates all prime numbers in N numbers in a row
                     #(N=1000 -> calculates all prime numbers in 1000 numbers,
                     #by default from 1 to 997)
        primes = []
        for i in range(start, N+1):
            if isPrimeNumber(i) == True:
                primes.append(i)
    elif numbers == 1: #Calculates N prime numbers in a row 
                       #(N=1000 -> calculates 1000 prime numbers)
        primes = [start]
        i = len(primes)
        j = 1
        while i <= N: #Stops, when we get N prime numbers - doesn't work!
            n = max(primes) + 1
            while j != 'stop':
                if isPrimeNumber(n, out='short') == True:
                    primes.append(n)
                    i = i + 1
                    j = 'stop' #Stops nested cycle, when reached 
                               #the first prime number
                else:
                    n = n + 1
    else:
        print 'Wrong input! 3rd number in function call must be either 0 or 1'
    return primes

関数isPrimeNumber()は正常に機能します。数値が=0の場合、関数primeNumbersも正常に機能します。しかし、numbers = 1の場合、見たところ、サイクルの1つが停止することはないので、理由を理解できません...

4

3 に答える 3

2

ここに無限ループがあります:

    while i <= N:
        n = max(primes) + 1 ### resetting `n'!
        while j != 'stop':
            if isPrimeNumber(n, out='short') == True:
                ...
                j = 'stop'
            else:
                n = n + 1

j設定すると'stop'、元に戻すことはできません。これが発生すると、内側はwhile事実上無操作になり、外側whileは無限ループになります。

于 2012-05-05T12:59:11.413 に答える
1

問題は、j変数が最終的に'stop'に設定され、その後再び設定されることはないためwhile j!='stop'、最初にのみ機能することです。

    # don't initialize j here
    while i <= N: #Stops, when we get N prime numbers - doesn't work!
        n = max(primes) + 1
        j = 1  #initialize it here
        while j != 'stop':
            if isPrimeNumber(n, out='short') == True:
                primes.append(n)
                i = i + 1
                j = 'stop' #Stops nested cycle, when reached 
                           #the first prime number
            else:
                n = n + 1
于 2012-05-05T13:07:12.580 に答える
0

ちょっと片付けようと思ったのですが…

from math import ceil
def isprime (n,out="short"):
    answer = True
    for p in range(2,int(ceil(n ** 0.5)) + 1):
        if n % p == 0:
            answer = False
            if out == "verbose":
                print "Least Divisor: " + str(p)
            return False
    if answer:
        if out == "verbose":
            print "No Divisors (Except For 1 & " + str(n) + "!"
        return True
def primenumbers (start = 1,stop = 1000,numbers = False):
    N = stop
    if numbers:
        primes = [start]
        i = len(primes)
        j = 1
        while i <= N:
            n = max(primes) + 1
            j = true
            while j:
                if isPrimeNumber(n):
                    primes.append(n)
                    i = i + 1
                    j = false
                else:
                    n = n + 1
    else
        primes = []
        for i in range(start,N + 1):
            if isPrimeNumber(i):
                primes.append(i)
    return primes

実際のプログラムを少し変更しました。

于 2013-09-03T21:42:01.917 に答える