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, MessagesSysUtilsVariantsClasses

  GraphicsControlsFormsDialogsStdCtrlsGrids;

type
  TfmPalind = class(TForm)
    lbPalindTLabel;
    btKilepesTButton;
    btStartTButton;
    edVegeSzamTEdit;
    lbIgTLabel;
    edSzamAktTEdit;
    edStartTEdit;
    edStopTEdit;
    edKezdSzamTEdit;
    lbTolTLabel;
    sgPalindTStringGrid;
    Function Palindrom(S: String): Boolean;
    Function DecToBin(N: Int64): String;
    procedure btKilepesClick(SenderTObject);
    procedure btStartClick(SenderTObject);
    procedure FormCreate(SenderTObject);
    procedure edVegeSzamChange(SenderTObject);
    procedure edKezdSzamChange(SenderTObject);
  private
    Private declarations }
  public
    { Public declarations }
  end;

var
  fmPalindTfmPalind;
  KezdSzamVegeSzam: Int64;

implementation

{$R *.dfm}

procedure TfmPalind.btKilepesClick(SenderTObject);
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:= FalseBreak 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(SenderTObject);
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(SenderTObject);
Var Kod: Integer;
begin
  Val(edKezdSzam.Text,KezdSzam,Kod);
end;

procedure TfmPalind.edVegeSzamChange(SenderTObject);
Var Kod: Integer;
begin
  Val(edVegeSzam.Text,VegeSzam,Kod);
end;

procedure TfmPalind.btStartClick(SenderTObject);
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.