Я смог сделать это, используя функцию сортировки вместо порядка, используя поле: title на контроллере статей.
def index
@articles = Article.sort(:title)
end
Существуют некоторые проблемы:
continue
перемещения к следующему повторению цикла - но Вы действительно хотите остановиться, это с помощью break
Вот код с несколькими мерами, это распечатывает только начала:
import math
def main():
count = 3
while True:
isprime = True
for x in range(2, int(math.sqrt(count) + 1)):
if count % x == 0:
isprime = False
break
if isprime:
print count
count += 1
Для намного более эффективного главного поколения, посмотрите Решето Erastothenes, как другие предположили. Вот хорошая, оптимизированная реализация со многими комментариями:
# Sieve of Eratosthenes
# Code by David Eppstein, UC Irvine, 28 Feb 2002
# http://code.activestate.com/recipes/117119/
def gen_primes():
""" Generate an infinite sequence of prime numbers.
"""
# Maps composites to primes witnessing their compositeness.
# This is memory efficient, as the sieve is not "run forward"
# indefinitely, but only as long as required by the current
# number being tested.
#
D = {}
# The running integer that's checked for primeness
q = 2
while True:
if q not in D:
# q is a new prime.
# Yield it and mark its first multiple that isn't
# already marked in previous iterations
#
yield q
D[q * q] = [q]
else:
# q is composite. D[q] is the list of primes that
# divide it. Since we've reached q, we no longer
# need it in the map, but we'll mark the next
# multiples of its witnesses to prepare for larger
# numbers
#
for p in D[q]:
D.setdefault(p + q, []).append(p)
del D[q]
q += 1
Примечание, что это возвращает генератор.
Можно создать список начал с помощью пониманий списка довольно изящным способом. Взятый от здесь:
>>> noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
>>> primes = [x for x in range(2, 50) if x not in noprimes]
>>> print primes
>>> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Вот то, что я имею:
def is_prime(num):
if num < 2: return False
elif num < 4: return True
elif not num % 2: return False
elif num < 9: return True
elif not num % 3: return False
else:
for n in range(5, int(math.sqrt(num) + 1), 6):
if not num % n:
return False
elif not num % (n + 2):
return False
return True
Это довольно быстро для больших количеств, поскольку это только проверяет по уже простым числам для делителей числа.
Теперь, если Вы хотите генерировать список начал, можно сделать:
# primes up to 'max'
def primes_max(max):
yield 2
for n in range(3, max, 2):
if is_prime(n):
yield n
# the first 'count' primes
def primes_count(count):
counter = 0
num = 3
yield 2
while counter < count:
if is_prime(num):
yield num
counter += 1
num += 2
генераторы использования здесь могли бы быть желаемы для эффективности.
И только для ссылки, вместо высказывания:
one = 1
while one == 1:
# do stuff
можно просто сказать:
while 1:
#do stuff
Необходимо удостовериться, что все возможные делители равномерно не делят число, которое Вы проверяете. В этом случае Вы распечатаете число, Вы проверяете любое время только, один из возможных делителей равномерно не делит число.
Также Вы не хотите использовать продолжать оператор, потому что продолжение просто заставит его проверять следующий возможный делитель, когда Вы уже узнали, что число не является началом.
Это кажется домашней-работой-y, таким образом, я дам подсказку, а не подробное объяснение. Исправьте меня, если я принял неправильно.
Вы в порядке до помощи, когда Вы видите ровный делитель.
, Но Вы печатаете 'количество', как только Вы видите даже один число, которое не делится на него. 2, например, не делится равномерно на 9. Но это не делает 9 начало. Вы могли бы хотеть продолжать идти, пока Вы не уверены никакой число в соответствиях диапазона.
(поскольку другие ответили, Решето является намного более эффективным способом пойти... просто пытаясь помочь Вам понять, почему этот определенный код не делает то, что Вы хотите)
def is_prime(num):
"""Returns True if the number is prime
else False."""
if num == 0 or num == 1:
return False
for x in range(2, num):
if num % x == 0:
return False
else:
return True
>> filter(is_prime, range(1, 20))
[2, 3, 5, 7, 11, 13, 17, 19]
Мы получим все простые числа до 20 в списке. Я, возможно, использовал Решето Эратосфена, но Вы сказали желание чего-то очень простого. ;)
продолжать оператор смотрит неправильно.
Вы хотите запуститься в 2, потому что 2 первое простое число.
можно записать "в то время как Верный": получить бесконечный цикл.
Вот простое (Python 2.6.2) решение ... которое соответствует исходному запросу OP (теперь уже шесть месяцев назад); и должно быть вполне приемлемым решением в любом курсе "программирование 101" ... Отсюда и этот пост.
import math
def isPrime(n):
for i in range(2, int(math.sqrt(n)+1)):
if n % i == 0:
return False;
return n>1;
print 2
for n in range(3, 50):
if isPrime(n):
print n
Этот простой метод "грубой силы" "достаточно быстр" для чисел примерно до 16, 000 на современных ПК (на моем компьютере с частотой 2 ГГц это заняло около 8 секунд).
Очевидно, это можно было бы сделать гораздо эффективнее, если бы не пересчитывать простоту каждого четного числа или каждого кратного 3, 5, 7 и т. Д. Для каждое отдельное число ... См. Сито Эратосфена (см. реализацию eliben выше) или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.
Caveat Emptor: я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.
или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.Caveat Emptor: Я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.
или даже Сито Аткина , если вы чувствуете себя особенно храбрым и / или сумасшедшим.Caveat Emptor: Я нуб питон. Пожалуйста, не принимайте все, что я говорю, как Евангелие.
print [x for x in range(2,100) if not [t for t in range(2,x) if not x%t]]