Palindromszámok
Egy karaktersor Palindrom, ha elölről és a végéről olvasva is ugyanazon karaktersorozatot kapjuk. Közismert, Palindromnak nevezett magyar mondatok a következők:
- Géza kék az ég
- Indul a pap aludni
- Kis Elek elesik, stb.
Ezek a példák csak kiejtés szerinti Palindromok, mert szigorú értelemben nem azok, a figyelembe nem vett szóközök, illetve a kis- és nagy betűk különbözősége miatt.
Egy számot Palindromszámnak nevezünk, ha valamelyik számrendszerben számjegyei szigorú értelemben véve Palindrom karaktersort alkotnak. Számos Web helyen utánanézhetünk például a 10-es számrendszerben Palindrom számoknak. Megadják számukat és képzési eljárásukat. Jelen lapon arra a kérdésre keresem a válasz, hogy melyek azok a számok, amelyek 10-es és kettes számrendszerben is Palindromok. Az ilyen számok száma nem nagy, hiszen, mint ahogy azt a futtatási kép is mutatja, 1 milliárdig csak 31 ilyen szám van.
A programban megadhatjuk a keresési intervallum első és utolsó elemét. Start után a minél gyorsabb futás érdekében csak minden milliomodik számnál frissül a képernyő. A program méri is kiírja a kereséshez szükséges időt.
A program futtatási képe az 1 milliárdig tartó keresés végén, mely 4 percig tartott:

A program listája:
unit UPalind;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TfmPalind = class(TForm)
lbPalind: TLabel;
btKilepes: TButton;
btStart: TButton;
edVegeSzam: TEdit;
lbIg: TLabel;
edSzamAkt: TEdit;
edStart: TEdit;
edStop: TEdit;
edKezdSzam: TEdit;
lbTol: TLabel;
sgPalind: TStringGrid;
Function Palindrom(S: String): Boolean;
Function DecToBin(N: Int64): String;
procedure btKilepesClick(Sender: TObject);
procedure btStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure edVegeSzamChange(Sender: TObject);
procedure edKezdSzamChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmPalind: TfmPalind;
KezdSzam, VegeSzam: Int64;
implementation
{$R *.dfm}
procedure TfmPalind.btKilepesClick(Sender: TObject);
begin
Close;
end;
Function TfmPalind.Palindrom(S: String): Boolean;
Var I, N: Word;
Begin
Palindrom:= True; N:= Length(S); If N In [0,1] Then Exit;
For I:= 1 To N Div 2 Do
If S[I]<>S[N-I+1] Then Begin Palindrom:= False; Break End;
End;
Function TfmPalind.DecToBin(N: Int64): String;
Var H, M: Int64;
S: String;
Begin
S:= ''; H:= N;
Repeat
If Odd(H) Then S:= '1'+S Else S:= '0'+S; M:= H Div 2; H:= M;
Until H=0;
DecToBin:= S;
End;
procedure TfmPalind.FormCreate(Sender: TObject);
begin
KezdSzam:= 0; VegeSzam:= 1000000000;
With sgPalind Do
Begin
ColWidths[0]:= 32;
ColWidths[1]:= 100;
Cells[0,0]:= 'Sorsz';
Cells[1,0]:= 'Decimális';
Cells[2,0]:= 'Bináris';
End;
end;
procedure TfmPalind.edKezdSzamChange(Sender: TObject);
Var Kod: Integer;
begin
Val(edKezdSzam.Text,KezdSzam,Kod);
end;
procedure TfmPalind.edVegeSzamChange(Sender: TObject);
Var Kod: Integer;
begin
Val(edVegeSzam.Text,VegeSzam,Kod);
end;
procedure TfmPalind.btStartClick(Sender: TObject);
Var I : Word;
N: LongInt;
S1, S2: String;
begin
edStart.Text:= TimeToStr(GetTime); edStart.Repaint;
edStop.Text:= ''; edStop.Repaint;
I:= 0;
For N:= KezdSzam To VegeSzam Do If Odd(N) Or (N=0) Then
Begin
If N Mod 1000000=1 Then
Begin edSzamAkt.Text:= IntToStr(N-1); edSzamAkt.RePaint End;
S1:= IntToStr(N);
If Palindrom(S1) Then
Begin
S2:= DecToBin(N);
If Palindrom(S2) Then With sgPalind Do
Begin
Inc(I); If RowCount-2<I Then RowCount:= RowCount+1;
Cells[0,I]:= IntToStr(I)+'.';
Cells[1,I]:= S1;
Cells[2,I]:= S2;
RePaint;
End;
End;
End;
edSzamAkt.Text:= IntToStr(VegeSzam);
edStop.Text:= TimeToStr(GetTime);
end;
end.