Brilliant numbers: Difference between revisions
Content added Content deleted
(Created Nim solution.) |
No edit summary |
||
Line 428: | Line 428: | ||
Elapsed time: 1.50048 seconds |
Elapsed time: 1.50048 seconds |
||
</pre> |
</pre> |
||
=={{header|Delphi}}== |
|||
{{works with|Delphi|6.0}} |
|||
{{libheader|SysUtils,StdCtrls}} |
|||
<syntaxhighlight lang="Delphi"> |
|||
function Compare(P1,P2: pointer): integer; |
|||
{Compare for quick sort} |
|||
begin |
|||
Result:=Integer(P1)-Integer(P2); |
|||
end; |
|||
procedure GetBrilliantNumbers(List: TList; Limit: integer); |
|||
{Return specified number of Brilliant Numbers in list} |
|||
var I,J,P,Stop: integer; |
|||
var Sieve: TPrimeSieve; |
|||
begin |
|||
Sieve:=TPrimeSieve.Create; |
|||
try |
|||
{build twices as many primes} |
|||
Sieve.Intialize(Limit*2); |
|||
{Pair every n-digt prime with every n-digit prime} |
|||
I:=2; |
|||
while true do |
|||
begin |
|||
J:=I; |
|||
{Put primes in J up to next power of 10 - 1} |
|||
Stop:=Trunc(Power(10,Trunc(Log10(I))+1)); |
|||
while J<Stop do |
|||
begin |
|||
{Get the product} |
|||
P:=I * J; |
|||
{and store in the list} |
|||
List.Add(Pointer(P)); |
|||
{Exit if we have all the numbers} |
|||
if List.Count>=Limit then break; |
|||
{Get next prime} |
|||
J:=Sieve.NextPrime(J); |
|||
end; |
|||
{break out of outer loop if done} |
|||
if List.Count>=Limit then break; |
|||
{Get next prime} |
|||
I:=Sieve.NextPrime(I); |
|||
end; |
|||
{The list won't be in order, so sort them} |
|||
List.Sort(Compare); |
|||
finally Sieve.Free; end; |
|||
end; |
|||
procedure ShowBrilliantNumbers(Memo: TMemo); |
|||
var List: TList; |
|||
var S: string; |
|||
var I,D,P: integer; |
|||
begin |
|||
List:=TList.Create; |
|||
try |
|||
{Get 10 million brilliant numbers} |
|||
GetBrilliantNumbers(List,1000000); |
|||
{Show the first 100} |
|||
S:=''; |
|||
for I:=0 to 100-1 do |
|||
begin |
|||
S:=S+Format('%7d',[Integer(List[I])]); |
|||
if (I mod 10)=9 then S:=S+CRLF; |
|||
end; |
|||
Memo.Lines.Add(S); |
|||
{Show additional information} |
|||
for D:=1 to 8 do |
|||
begin |
|||
P:=Trunc(Power(10,D)); |
|||
{Scan to find for 1st brilliant number >= 10^D } |
|||
for I:=0 to List.Count-1 do |
|||
if Integer(List[I])>=P then break; |
|||
{Display the info} |
|||
S:=Format('First brilliant number >= 10^%d is %10d',[D,Integer(List[I])]); |
|||
S:=S+Format(' at position %10D', [I]); |
|||
Memo.Lines.Add(S); |
|||
end; |
|||
finally List.Free; end; |
|||
end; |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
4 6 9 10 14 15 21 25 35 49 |
|||
121 143 169 187 209 221 247 253 289 299 |
|||
319 323 341 361 377 391 403 407 437 451 |
|||
473 481 493 517 527 529 533 551 559 583 |
|||
589 611 629 649 667 671 689 697 703 713 |
|||
731 737 767 779 781 793 799 803 817 841 |
|||
851 869 871 893 899 901 913 923 943 949 |
|||
961 979 989 1003 1007 1027 1037 1067 1073 1079 |
|||
1081 1121 1139 1147 1157 1159 1189 1207 1219 1241 |
|||
1247 1261 1271 1273 1333 1343 1349 1357 1363 1369 |
|||
First brilliant number >= 10^1 is 10 at position 3 |
|||
First brilliant number >= 10^2 is 121 at position 10 |
|||
First brilliant number >= 10^3 is 1003 at position 73 |
|||
First brilliant number >= 10^4 is 10201 at position 241 |
|||
First brilliant number >= 10^5 is 100013 at position 2504 |
|||
First brilliant number >= 10^6 is 1018081 at position 10537 |
|||
First brilliant number >= 10^7 is 10000043 at position 124363 |
|||
First brilliant number >= 10^8 is 100140049 at position 573928 |
|||
Elapsed Time: 185.451 ms. |
|||
</pre> |
|||
=={{header|Factor}}== |
=={{header|Factor}}== |
||
{{works with|Factor|0.99 2022-04-03}} |
{{works with|Factor|0.99 2022-04-03}} |