Just another update
This commit is contained in:
parent
a25938f123
commit
00a190b0a6
6591 changed files with 94363 additions and 23227 deletions
94
Task/Hailstone-sequence/Pascal/hailstone-sequence.pascal
Normal file
94
Task/Hailstone-sequence/Pascal/hailstone-sequence.pascal
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
program ShowHailstoneSequence;
|
||||
{$IFDEF FPC}
|
||||
{$MODE delphi} //or objfpc
|
||||
{$Else}
|
||||
{$Apptype Console} // for delphi
|
||||
{$ENDIF}
|
||||
|
||||
uses
|
||||
SysUtils;// format
|
||||
type
|
||||
tIntArr = record
|
||||
iaAktPos : integer;
|
||||
iaMaxPos : integer;
|
||||
iaArr : array of integer;
|
||||
end;
|
||||
|
||||
procedure GetHailstoneSequence(aStartingNumber: Integer;var aHailstoneList: tIntArr);
|
||||
var
|
||||
n: UInt64;
|
||||
begin
|
||||
with aHailstoneList do
|
||||
begin
|
||||
iaAktPos := 0;
|
||||
iaArr[iaAktPos] := aStartingNumber;
|
||||
n := aStartingNumber;
|
||||
while n <> 1 do
|
||||
begin
|
||||
if Odd(n) then
|
||||
n := (3 * n) + 1
|
||||
else
|
||||
n := n div 2;
|
||||
inc(iaAktPos);
|
||||
IF iaAktPos>iaMaxPos then
|
||||
Begin
|
||||
iaMaxPos := round(iaMaxPos*1.62)+2;
|
||||
setlength(iaArr,iaMaxPos+1);
|
||||
end;
|
||||
iaArr[iaAktPos] := n;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
i,Limit: Integer;
|
||||
lList: tIntArr;
|
||||
lMaxSequence: Integer;
|
||||
lMaxLength: Integer;
|
||||
begin
|
||||
try
|
||||
with lList do
|
||||
begin
|
||||
setlength(iaArr,0+1);
|
||||
iaMaxPos := 0;
|
||||
iaAktPos := 0;
|
||||
end;
|
||||
|
||||
GetHailstoneSequence(27, lList);
|
||||
with lList do
|
||||
begin
|
||||
i := iaAktPos+1;
|
||||
Writeln(Format('27: %d elements', [i]));
|
||||
Writeln(Format('[%d,%d,%d,%d ... %d,%d,%d,%d]',
|
||||
[iaArr[0], iaArr[1], iaArr[2], iaArr[3],
|
||||
iaArr[i - 4], iaArr[i - 3], iaArr[i - 2], iaArr[i - 1]]));
|
||||
Writeln;
|
||||
|
||||
lMaxSequence := 0;
|
||||
lMaxLength := 0;
|
||||
limit := 10;
|
||||
for i := 1 to 10000000 do
|
||||
begin
|
||||
GetHailstoneSequence(i, lList);
|
||||
if iaAktPos >= lMaxLength then
|
||||
begin
|
||||
IF i> limit then
|
||||
begin
|
||||
Writeln(Format('Longest sequence under %8d : %7d with %3d elements',
|
||||
[limit,lMaxSequence, lMaxLength]));
|
||||
limit := limit*10;
|
||||
end;
|
||||
lMaxSequence := i;
|
||||
lMaxLength := iaAktPos+1;
|
||||
end;
|
||||
end;
|
||||
Writeln(Format('Longest sequence under %8d : %7d with %3d elements',
|
||||
[limit,lMaxSequence, lMaxLength]));
|
||||
|
||||
end;
|
||||
finally
|
||||
setlength(lList.iaArr,0);
|
||||
end;
|
||||
writeln('game over, wait for >ENTER< ');
|
||||
Readln;
|
||||
end.
|
||||
Loading…
Add table
Add a link
Reference in a new issue