# How to find the bigger number.

Hi...

This is easy i guess... I'm just not in thinging mode... right now and i want it fast.

So...
I have 120 integers and i want to find the 3 bigger numbers.
I need a smart way to do this with few lines.

LVL 16
###### Who is Participating?

Senior DeveloperCommented:
to find the bigger of 2 numbers you can use
uses math;
i := max(j, k);

1 way for you to get the top 3 would be to have the numbers in a sorted list
eg.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, math,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
numberlist: TList;
end;

var
Form1: TForm1;

function comparenumbers(Item1, Item2: Pointer): Integer;

implementation

{\$R *.DFM}

function comparenumbers(Item1, Item2: Pointer): Integer;
begin
if Integer(Item1) < Integer(Item2) then result := -1
else if Integer(Item1) > Integer(Item2) then result := 1
else result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
numberlist := TList.create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
numberlist.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
// make sure the numbers are sorted
numberlist.Sort(comparenumbers);
// now grab the top 3 numbers and display them
for i := (numberlist.count -1) downto (numberlist.count -3) do
end;

end.
0

Senior DeveloperCommented:
I know you said "a few lines" but really it's just "sort" then the for loop :-)
here's a way to do it assuming the get the numbers from somewhere else

procedure TForm1.Button2Click(Sender: TObject);
var
sl: TStringList;
i, value: integer;
s: string;
begin
sl := TStringlist.create;
try
sl.sorted := True;
i := 0; // first index from whatever source of numbers you have
while (i < numberlist.count) do  // last index from whatever source of numbers you have
begin
// get the number using index i from your source numbers and convert it to a 10 length padded string
SL.Add(Format('%10d', [ integer(numberlist[i]) ] )); // if you need bigger numbers, use a number > %10
inc(i); // go to the next number
end;
// now grab the top 3 numbers and display them
for i := (sl.count -1) downto (sl.count -3) do
begin
value := StrToInt( sl[i] );
end;
finally
sl.free;
end;
end;
0

Commented:
Not so briliant but possibly faster method.

procedure TForm1.Button1Click(Sender: TObject);
const
numcount = 100;
var
intnum: array[0..numcount-1] of integer;
i: integer;
b1,b2,b3: integer;
begin
// fill in the array
for i := 0 to numcount-1 do
intnum[i] := random(1500);

if intnum[0] > intnum[1] then
begin
b1 := intnum[0];
b2 := intnum[1];
end
else
begin
b1 := intnum[1];
b2 := intnum[0];
end;
b3 := intnum[2]-1;

for i := 3 to numcount-1 do
begin
if intnum[i] > b3 then
begin
if intnum[i] > b2 then
begin
b3 := b2;
if intnum[i] > b1 then
begin
b2 := b1;
b1 := intnum[i];
end
else
b2 := intnum[i];
end
else
b3 := intnum[i];
end;
end;
end;
0

Author Commented:
Thank you both.

There is a small problem... I need to know the var that holds the bigger value...
Example : bigger 3 =>(a14, a87, a2)... not only the value.
---------------------------------------------

Since all the numbers will be finally loaded in a Chart maybe there is another way...

X axis represents the variable (a0, a1, a2...a120).

I've loaded all the vars in a TChart !
So with the command :

Chart1.SeriesList.Series[0].MaxYValue; .... i will find the bigger number.

Is there a command for this :
(For this Y which is the X) ???
(And with a for loop decreasing by 1 from the bigger y which is the next bigger y) ?

I hope i make sense.... Thank you very much :)
0

Author Commented:
Forget it... Thank you for your time :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.