unit U_SquaresCubes4;
{Pythagorean Triples problem}
{ Find the smallest Pythogorean triangle whose
perimeter is a perfect square and whose area is
a perfect cube.}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
SolveBtn: TButton;
Memo1: TMemo;
procedure SolveBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Uses Math;
{$R *.DFM}
Function cubert(a:extended):integer;
Begin
result:=trunc(power(a, 1/3));
{If you don;t have the math unit available to get the
power function, you can substitute
result:= trunc(exp(ln(a)/3));
}
end;
procedure TForm1.SolveBtnClick(Sender: TObject);
var
a,b,c,w:integer;
area,perimeter,x:extended;
solved:boolean;
startcount,stopcount, freq:int64;
begin
solved:=false;
screen.cursor:=crhourglass;
QueryPerformanceCounter(startcount);
For a:= 3 to 1000 do
{There's probably some better upper limit for b, but I don't know what it is,
and a-1 is safe}
for b:= 1 to a-1 do
Begin
{Check if a&b form 2 sides of a right triangle}
w:=sqr(a)+sqr(b);
c:=trunc(sqrt(w));
If sqr(c) = w then {it is a Pythagorean triple}
Begin
perimeter:=a+b+c;
x:=trunc(sqrt(perimeter));
if sqr(x)=perimeter then {perimeter is a square}
Begin
area:=(a*b) div 2; {area of a right triangle is half the product odf the 2 short sides}
x:=trunc(cubert(area));
if x*x*x=area {area is a cube!}
then
Begin
QueryPerformanceCounter(stopcount);
QueryPerformanceFrequency(freq);
showmessage(' Found! '
{reverse a & b for printing so smallest # is first}
+' a=' + inttostr(b)
+', b=' + inttostr(a)
+', c=' + inttostr(c)
+#13#13 {new line characters}
+format('Run time was %6.1n milliseconds',
[(stopcount-startcount)*1000 /freq]));
QueryPerformanceCounter(startcount);
end;
end;
end; {Pyth. triple}
If solved then break;
end; {a loop}
screen.cursor:=crdefault;
end;
end.