Вы заканчиваете цикл слишком рано. После того, как вы проверили все возможности в теле цикла for, а не сломались, число будет простым. Поскольку одно не простое, вам нужно начинать с 2:
for num in xrange(2, 101):
for i in range(2,num):
if not num % i:
break
else:
print num
. В более быстром решении вы пытаетесь разделить на простые числа, которые меньше или равны корню числа, которое вы тестируете. Это может быть достигнуто путем запоминания всех простых чисел, которые вы уже нашли. Кроме того, вам нужно только проверить нечетные числа (кроме 2). Вы можете поместить полученный алгоритм в генератор, чтобы вы могли использовать его для хранения простых в контейнере или просто распечатывать их:
def primes(limit):
if limit > 1:
primes_found = [(2, 4)]
yield 2
for n in xrange(3, limit + 1, 2):
for p, ps in primes_found:
if ps > n:
primes_found.append((n, n * n))
yield n
break
else:
if not n % p:
break
for i in primes(101):
print i
Как вы можете видеть, нет необходимости вычислять квадратный корень, быстрее хранить квадрат для каждого простого числа и сравнивать каждый делитель с этим числом.
CONVERT([varchar](4),@Year,(0))+'-01-01'
передается на вызов DATEDIFF
в позиции, где ожидается ожидаемая дата, что приводит к неявному преобразованию.
Из правил для детерминированных функций :
CAST
Определяется, если не используется с
datetime
,smalldatetime
илиsql_variant
.
CONVERT
Определительно, если не существует одно из этих условий:
...
Тип источника или цели
blockquote>datetime
илиsmalldatetime
, другой источник или цель type является символьной строкой, и указан недетерминированный стиль. Чтобы быть детерминированным, параметр стиля должен быть константой. Кроме того, стили, меньшие или равные 100, являются недетерминированными, за исключением стилей 20 и 21. Стили более 100 являются детерминированными, за исключением стилей 106, 107, 109 и 113.вы не вызываете никого, но вы полагаетесь на неявное преобразование, которое я ожидаю, как
CAST
. Вместо того, чтобы полагаться на это, я бы переключился на использованиеCONVERT
и дал детерминированный параметр стиля.Итак, я сделал бы:
CONVERT(datetime,CONVERT([varchar](4),@Year,(0))+'0101',112)
на своем месте. Сделав это, сама функция становится детерминированной