[Tutor] [Spoiler alert] Re: To find the least number divisible by all numbers from 1-20

Oscar Benjamin oscar.j.benjamin at gmail.com
Tue Aug 13 20:42:46 CEST 2013


On Aug 13, 2013 7:21 PM, "Peter Otten" <__peter__ at web.de> wrote:
>
> Peter Otten wrote:
>
> > I'll post a naive implementation of that idea in a follow-up.
>
> So there:
>
> def gcd(a, b):
>     if a == b:
>         return a
>     elif a > b:
>         return gcd(a-b, b)
>     else:
>         return gcd(a, b-a)
>
> N = 20
> numbers = range(2, N+1)
> while len(numbers) > 1:
>     numbers.sort()
>     a, b = numbers[:2]
>     d = gcd(a, b)
>     numbers[:2] = [a*b//d]
> result = numbers[0]
> assert all(result % i == 0 for i in range(1, N+1))
> print result
>
> It turns out I can only avoid the recursion limit by sorting the numbers
and
> picking the smallest. For greater N you need to come up with a smarter
> approach (the actual limit was N<=48) or at least a non-recursive
> implementation of gcd().

I think it's better to compute the lcm by finding its prime factorisation.
E.g. There are 4 twos in it since that's the maximum number of twos in the
prime factorisation of any of the integers up to 20.

I would post a snippet but isn't it generally a bit of a faux-pas to give
solutions to these problems (I mean this as a real question)?

Oscar

>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20130813/47e75444/attachment-0001.html>


More information about the Tutor mailing list