[Tutor] Add all natural numbers that are multiples of 3 and 5

Benjamin Serrato benjamin.serrato at gmail.com
Sun Jan 4 03:43:31 CET 2009


I changed it to this:

#!/usr/local/bin/python3.0
#problem1.py

"""Lists the sum of all multiples of 3 and 5 less than 1000."""

def sumTotal(multipleInitial, multiple):    # This awkward solution because
    total = 0                                          #
mulitipleInitial = multiple just points
    n = 2                                              # a new
variable to the same memory
    while multiple < 1000:                      # space
        total = total + multiple
        multiple = multipleInitial * n
        n = n + 1
    return total

print(sumTotal (3, 3) + sumTotal(5,5))

-----
I think it does what I wanted it to do, but Kent pointed out I wanted
it to do was a false solution.  So, I can create a list of all common
multiples below 1000, sum them, subtract them from 266 333.  Or, what
I prefer, create a list of all multiples, checking against that list
for a multiple before adding a new multiple.  But, I don't know how to
work with lists so I'll be back in a day or two.



On Sat, Jan 3, 2009 at 6:43 PM, Andre Engels <andreengels at gmail.com> wrote:
>
> On Sun, Jan 4, 2009 at 1:06 AM, Benjamin Serrato
> <benjamin.serrato at gmail.com> wrote:
> > Hello,
> >
> > I'm trying to correctly solve the first projecteuler.net problem. The
> > question is as so: Find the sum of all the multiples of 3 or 5 below 1000.
> >
> > I wrote the following program, but the number found is incorrect. I created
> > a function that adds multiples of a given number to a global variable until
> > the multiples are greater than 1000.  The solution I get with my code is
> > "1224". This is incorrect, but I am having trouble understanding why my code
> > is wrong... it's very simple.
> > My code:
> >
> > #!!/usr/local/bin/python3.0
> > #problem1.py
> >
> > """Lists the sum of all multiples of 3 and 5 less than 1000."""
> >
> > # Initialize variable 'total'.
> > total = 0  # I wanted this to be 'None', is that wrong?
> >
> > def sumTotal(multiple):
> >     global total  # Brings total into the local scope so it
> >                       # can be written to.
> >     n = 2
> >     while multiple < 1000:
> >         total = total + multiple
> >         multiple = multiple * n
> >         n = n + 1   # I wanted this to be += but I'm not sure
> >                         # that is right.
> >
> > # Now I call the function with the two arguments I need, 3
> > # and 5.  Since total is a global variable it retains its value
> > # at the end of the first function call, the next call adds to
> > # the total value.  Thus print(total) should give me the correct
> > # value.
> >
> > sumTotal(3)
> > sumTotal(5)
> >
> > print(total)
> >
> > -----
> > I think I have made a mistake with scope.  Or some other syntactic error,
> > because I don't see anything wrong with the code. Please make it obvious for
> > me.
>
> There is an error with the code. The line
>
>     multiple = multiple * n
>
> is not doing what you want it to do.
>
> See what is happening each time you go through this line:
>
> first time:
> * multiple = 3
> * n = 2
> * multiple changed to 6
>
> second time:
> * multiple = 6
> * n = 3
> * multiple changed to 18
>
> third time:
> * multiple = 18
> * n = 4
> * multiple changed to 72
>
> etcetera
>
> You will have to keep the number to multiply by in a separate variable
> to avoid this.
>
> Apart from that, I think your usage of a global variable total,
> although correct, is ugly and error-prone. I would do away with a
> global variable total, add a local variable total, and end defSum with
> "return total".
>
> Then the main body can be changed to:
>
> print (sumTotal(3) + sumTotal(5))
>
> --
> André Engels, andreengels at gmail.com


More information about the Tutor mailing list