Форум сайта python.su
1
Вот наткнулся на такую прекрасную задачку, кстати только пятую по счету))
Условие…
Найти наименьшее целое число, которое нацело делится на все числа от 1 до 20…
ХА-ХА! Вот почему-то только мой “шедевр” загружает CPU на 100%, и в таком состоянии оставляет его на долго (число я так и не узнал)))
Портированный бейсик)):
a = 20 # С этого числа начнется проверка на деление s = [] for i in range(1, 21): s.append(i) i = 0 while 1: if a % s[i] == 0: i += 1 if i == 20: print(a) break continue else: a += 1 i =0
Отредактировано zipsetic (Май 7, 2012 18:33:28)
Офлайн
0
Вспомнить формулу НОК.
Вот например и алгоритм с примерами.
Офлайн
3
емнип тут достаточно перемножить все простые числа в заданном интервале
Офлайн
1
Пожалуй, идеальное решение!!! Взял с форума
кому интересно:
i = 1 for k in (range(1, 21)): if i % k > 0: for j in range(1, 21): if (i*j) % k == 0: i *= j break print(i)
Отредактировано zipsetic (Май 7, 2012 19:39:07)
Офлайн
568
zipseticС какого форума сей говнокод взят?
Пожалуй, идеальное решение!!! Взял с форума
кому интересно:гениально!:Di = 1 for k in (range(1, 21)): if i % k > 0: for j in range(1, 21): if (i*j) % k == 0: i *= j break print(i)
Офлайн
1
FishHook
С какого форума сей говнокод взят?
только не говори, что можешь лучше, докажи на деле! Покажи свой эээ… неГОВНОКОДОтредактировано zipsetic (Май 8, 2012 20:19:58)
Офлайн
18
сравниваем на больших числах, не 21 а больше 10000
def reshetoEratosfena(n): resheto= list(range(2,n)) for j in range(0,n): p=resheto[j] if p**2>n: break i=j+1 while i<len(resheto): if resheto[i]%p==0: resheto.remove(resheto[i]) i=i+1 return resheto def getMinProstMnoj(x): for p in prost: if not x % p: return p raise ValueError def getProstmnoj(x): out = {} while x>1: p = getMinProstMnoj(x) if p not in out: out[p] = 0 out[p] += 1 x = x/p return out def main(maxx): maxstepen = {} global prost prost = reshetoEratosfena(maxx) for x in range(1,maxx): out = getProstmnoj(x) for p,i in out.items(): if p not in maxstepen: maxstepen[p] = 0 maxstepen[p] = max(i, maxstepen[p]) nop = 1 for p,i in maxstepen.items(): nop *= p**i print (nop) if __name__ == '__main__': from time import time t = time() main(10000) print(time() - t)
Офлайн
13
Вот здесь по-моему более читабельное решение: http://stackoverflow.com/questions/147515/least-common-multiple-for-3-or-more-numbers
def gcd(a, b):
"""Return greatest common divisor using Euclid's Algorithm."""
while b:
a, b = b, a % b
return a
def lcm(a, b):
"""Return lowest common multiple."""
return a * b // gcd(a, b)
def lcmm(*args):
"""Return lcm of args."""
return reduce(lcm, args)
Офлайн
1
sp3Круто, попытаюсь разобраться…
сравниваем на больших числах, не 21 а больше 10000
Отредактировано zipsetic (Май 9, 2012 13:17:39)
Офлайн
13
sp3Сравнил для 3000. Хацкерский вариант ‘с форума’ отработал за 1.4 сек, ваш - за 0.05, тот, что я запостил - за 0.01
сравниваем на больших числах, не 21 а больше 10000
Офлайн