[Coco] Project Euler and the Coco
flexser at fiu.edu
Sat Nov 15 06:27:46 EST 2008
I just thought of a simpler and easier way to explain how to get the appropriate
upper limit for B:
Imagine a board of length 1000, to be divided into 3 pieces, A, B, and C, of
ascending size. Whatever the size of A is (and it can't exceed 1/3 of the total
length, to achieve ascending lengths), the remaining 1000-A of length must be
divided between B and C. The ascending length requirement means that B must
take up no more than half of the remaining board, or (1000-A)/2. My expression
A+INT((1000-3*A-1)/2) for the maximum value of B simplifies to that, if we
disregard the '-1' that is the minimum required difference between B and C.
On Sat, 15 Nov 2008, Arthur Flexser wrote:
> I think the limits aren't right. Here's how I figure it:
> Since we want a <= b < c, let b=a+d1 and c=b+d2, where d1 >= 0 and d2 > 0.
> Then a+b+c=1000 is equivalent to a+(a+d1)+((a+d1)+d2)=1000, or 3a+2d1+d2=1000.
> The minimum value of d1, the difference between b and a, is 0; what is its
> maximum? For a given value of a, the maximum of d1 occurs when d2 assumes its
> minimum value of one, giving d1=(1000-3a-1)/2. So, I'd start with
> 10 FOR A=1 TO 333 (why is A=1 excluded in the original?)
> 20 BH=A+INT((1000-3*A-1)/2): A2=A*A
> 30 FOR B=A TO BH
> Since this upper limit for B guarantees that C will exceed A and B, the check in
> line 40 may be omitted.
> I see no apparent reason why B must be in the range 334 to 667, as John
> assumed. Why exclude, for example, the abc combination 200, 300, 500, which
> properly adds to 1000, from testing?
> On Fri, 14 Nov 2008, John wrote:
> > Hello all,
> > I'm sure by now many of you have seen Project Euler"at
> > http://projecteuler.net/.
> > If not, they have math problems to solve. One example is the 9th easiest:
> > Find the product of a,b,c such that a^2 + b^2 = c^2 and a+b+b=1000.
> > I used my Coco2 to solve this problem in 11 and a half minutes using the
> > high speed poke. At the risk of flooding the list with BASIC code, I hope
> > my short program here will spur comments and optimizations:
> > 10 FOR A = 2 TO 333
> > 20 FOR B = 334 TO 667
> > 30 C = 1000 -A -B
> > 40 IF C<A OR C<B THEN 60
> > 50 IF A*A + B*B = C*C THEN 100
> > 60 NEXT B,A
> > 100 PRINT "A="A
> > 110 PRINT "B="B
> > 120 PRINT "C="C
> > 130 PRINT "A X B X C ="A*B*C
> > For example, one optimization became clear after I had the answer. As a
> > hint, I could cut run time by about 40%...
> > I hope everyone has some fun with these,
> > John
> > --
> > Coco mailing list
> > Coco at maltedmedia.com
> > http://five.pairlist.net/mailman/listinfo/coco
> Coco mailing list
> Coco at maltedmedia.com
More information about the Coco