unit U_SquaresCubes3;
{There is a number which, when cubed is 2,000,000 larger
than a number which is the square of a facotr of 2,000,000}
{What is the number?}

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

{$R *.DFM}

uses  math;

procedure TForm1.SolveBtnClick(Sender: TObject);
var
  start,n3,nm2,root:int64;
  solved:boolean;
  i:integer;
begin
{since we are going to cube start values
 and subtract 2,000,000 and since the result
 must be positive (it is to the square of a factor),
 we might as well start at the cube root of 2,000,000}

  start:=trunc(power(2000000.0,1/3));
  root:=0;
  solved:=false;
  while  (not solved) and (root< 1000000) do
  begin
    inc(start);
    n3:=start*start*start;
    nm2:=n3-2000000;
    {trick sqrt function by forcing conversion of
     nm2 to extended by adding 0.0 to it - it's a fluke
     of Delphi that integer types will automatically be
     convereted but int64 types will not}
    root:=trunc(sqrt(0.0+nm2));
    if root*root=nm2 then
    begin
      {if root is a factor of 2,000,000 then solved}
      if 2000000 mod root = 0 then
      begin
        showmessage('Solved! '
                   +#13+inttostr(start)
                   +' cubed is '+format('%6.0n',[0.0+n3])
                   +', which less 2,000,000 is '
                   +format('%6.0n',[0.0+nm2])
                   +#13+ ' which is the square of '
                   +format('%6.0n',[0.0+root])
                   +' which is a factor of 2,000,000');
        solved:=true;
      end;
    end;
  end;
  If not solved then showmessage('No solution found');
end;

end.