Wątek zablokowany 2018-11-07 08:18 przez Patryk27.

Liczby Pierwsze

0

Witajcie. Przeczytałem dzisiaj 2 poradniki po około 60 stron w pdf oraz kilka online na stronie i postanowiłem zrobić kilka programów w pythonie jako iż jest to mój 1 dzień nauki.

Zrobiłem taki programik (wypisuje liczby pierwsze z podanego przedziału)

>>> def nLiczby(nLiczbaOd, nLiczbaDo):
... 	nLista = []
... 	for i in range(nLiczbaOd, nLiczbaDo):
... 		for x in range(2,i):
... 			if (i % x) == 0:
... 				break
... 			else:
... 				if( x == i-1):
... 					nLista.append(i)
... 		if( i == nLiczbaDo-1):
... 			print 'Liczby pierwsze: '
... 			print nLista
... 			
>>> nLiczby(10,100) # tak wywołuje funkcje nLiczby
 

A oto wynik :
Liczby pierwsze:
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

Wszystko jest ładnie, pięknie ale moje pytanie, czy kod jest napisany poprawnie bo nie znam jeszcze dokładnie tego języka i co by można zmienić w tym kodzie by był bardziej 'optymalny'

Z góry dzięki ;)

0

Zauważ, że jeżeli pewna liczba i nie ma dzielnika niewiększego od pierwiastka z i, to już na pewno jest pierwsza (znane ulepszenie). Na przykład, 73 nie ma dzielnika większego od 1 i mniejszego lub równego niż pierw(73)=8,544.
Program na oko wygląda dobrze, jednak wolałbym poczekać na opinię kogoś, kto zna się na Pythonie lepiej.

0
>>> def nLiczby(nLiczbaOd, nLiczbaDo):
...	nLista = []
...	for i in range(nLiczbaOd, nLiczbaDo):
...		for x in range(2,i):
...			if (i % x) == 0:
...				break
...		else:
...			nLista.append(i)
...	print 'Liczby pierwsze: '
...	print nLista
  • uwagi mnbvcX'a
    Zapytoniaste jest else do for
0
from math import sqrt

def isPrime(n):
    return n > 1 and all(n % d != 0 for d in range(2, int(sqrt(n))))

def enumPrimes(start, end):
    return [ n for n in range(start, end) if isPrime(n) ]

print 'Liczby pierwsze: ', enumPrimes(10, 100)
0

nie kminie jeszcze tego co napisał ofidyfil ale dzięki wam za podpowiedź, czyli nie miałem tak źle tylko tych ifów troszkę za dużo ; d

0

twój problem (nazwijmy tak twoje pytanie) nie polega na nieznajomości składni języka, a na brakach w podstawach matematyki bądź zerowym doświadczeniu w algorytmice. Tak czy siak w tym wypadku nie ważny jest język lecz problem jaki za pomocą niego rozwiązujesz (i tak to zwykle wygląda w programowaniu).

0

Jeszcze co innego, powinno być jeszcze szybsze:

#!/usr/bin/python
def gen(n):
    pierwsze=[]
    i=2 #trzeba zacząć od 2
    while len(pierwsze)<n-1:
        jest=False
        for a in pierwsze:
            if i%a==0:
                jest=True
                break
        if not jest:
            pierwsze.append(i)
        i+=1
    pierwsze.insert(0,1) #gdyby zaczął od jedynki, wszystko byłoby podzielne, dlatego jedynkę trzeba na końcu dodać
    return pierwsze
print(gen(30))

Zwraca n pierwszych liczb pierwszych. Dzieli tylko przez znalezione do tej pory pierwsze liczby. Po co dzielić przez 4, skoro liczba nie jest podzielna przez 2?

1 użytkowników online, w tym zalogowanych: 0, gości: 1