Project euler no. 3
Dave Angel
davea at ieee.org
Sat Sep 12 20:32:55 CEST 2009
Kee Nethery wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">in
> checkPrime what do you return when "x" is less than 2?
>
> On Sep 12, 2009, at 8:46 AM, Someone Something wrote:
>
>> But, I'm returning true or false right?
>>
>> On Sat, Sep 12, 2009 at 11:32 AM, MRAB <python at mrabarnett.plus.com>
>> wrote:
>> Someone Something wrote:
>> Project euler (in case you don't know: projecteuler.net
>> <http://projecteuler.net>)
>>
>>
>> I'm trying to do the third one and here's my current code:
>>
>> 1 def checkPrime (x):
>> 2 factors=2;
>> 3 while factors<=x:
>> 4 if x==factors:
>> 5 return True;
>> 6 elif x%factors==0:
>> 7 return False;
>> 8 elif x%factors!=0:
>> 9 factors=factors+1;
>>
>> You're not returning 'factors', so the function will return None.
>>
>>
>> 10
>> 11 factorl=[];
>> 12 factors=600851475142;
>> 13
>> 14 while factors != 1:
>> 15 if 600851475143%factors==0:
>> 16 if checkPrime(factors)==True:
>> 17 print factors;
>> 18 else:
>> 19 factors=factors-1;
>> 20
>> 21 else:
>> 22 factors=factors-1;
>> 23
>>
>> And it just gets frozen when I run it. I put a
>>
>> print "Loop completed"
>>
>> in one of the loops and it showed up just fine. So, there are two
>> possibilities:
>> 1. Its looping in the trillions and taking a while
>> 2. I have a forever loop somewhere
>>
>>
>> --
>> http://mail.python.org/mailman/listinfo/python-list
>>
>> --
>> http://mail.python.org/mailman/listinfo/python-list
>
It's a rather minor point that it returns None for values less than 2.
If/when somebody writes documentation, one might just specify the
precondition that x >=2. After all, there aren't too many primes below
that value. And actually, when one does an if-test, None is pretty
close to False. And this program won't call it with a value less than 2.
To the OP:
The original Euler problem asked "What is the largest prime factor of
the number 600851475143 "
This program could get that answer, but very slowly. The problem is
it's starting its guessing at 600 billion, and counting down by ones.
That's going to take a very long time. The OP needs to study the nature
of factoring, to pick a better starting point. There are other
inefficiencies, but this one fix gets the run time down to a couple of
seconds (if you don't count the fact that it then repeatedly prints the
answer, ad-infinitum.)
Another piece of advice - pick symbol names that represent their purpose
in some way. An integer shouldn't be called factors, since that's
plural. When I see a name like that, I expect to see a list of integers.
Please don't include line numbers; it makes it quite difficult to
copy/paste the code into an editor to try it. And lose the semicolons.
They're a leftover from other languages.
DaveA
More information about the Python-list
mailing list