f=range(2,21) print f v=f[:] o=[] for x in v: for y in range(2,x): if x%y==0 and x!=y: o.append(x) print o
[2,6,6,8,8,9,10,10,12,12,12,12]
f=range(2,6) print f v=f[:] o=[] for x in v: for y in range(2,x): if x%y==0: f.remove(x) print f, v print f
Почему такой код срабатывает без ошибок?
f=range(2,21) print f v=f[:] o=[] for x in v: for y in range(2,x): if x%y==0: f.remove(x) print f, v print f
И почему обход в цикле списка и удаление из этого же списка элементов срабатывает без ошибок в этом случае:
# -*- coding: utf-8-*- #z=5*7*13*29 #print z # 5,7,13 and 2 are prime factors of 13195 #Простое число: имеет только два делителя (1 и оно само) x=13195 s=[] r=range(13195/2) # Дальше 13195/2 все равно нет делителей 13195, кроме его самого. r.remove(0) e=range(10) e.remove(0) e.remove(1) for x in r: # Составляем список всех чисел, на которые 13195 делится нацело if 13195%x==0: s.append(x) o=[] for x in s: for y in e: if x%y==0 and x!=y: # Убираем из них числа, которые нацело делятся на числа от 1 до 10 o.append(x) for z in range(2,x): # Убираем из них числа, которые нацело делятся на простые делители, попавшие в список s if x%z==0: o.append(x) for x in o: # Убираем эти числа, которые не простые, получаем список простых делителей 13195 if x in s: s.remove(x) w=max(s) # Ищем максимальлный простой делитель print w # Ответ
PS И, возможно, кто-нибудь знает, откуда вообще взялась цифра в корень из n? https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%81%D1%82_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D1%82%D1%8B
Значительно позже арабский математик ибн ал-Банна предложил делать перебор целых чисел, не до n, а до \sqrt{n}, что позволило уменьшить количество операций.