Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Werte auslesen und vergleichen (Palindrome)


LuGo - Mi 07.07.10 16:43
Titel: Werte auslesen und vergleichen (Palindrome)
Hallo erstmal,

wir haben heute in Mathe so ein Problem besprochen, das mit dem Phalindrom, das wenn man zwei dreistellige Zahlen addiert (wo bei die 2te die umgedrehte erste ist (z. B. 125 + 521)), man solange weiterrechnen sollte (also dann 646 + 646) usw. bis es ein sog. Phalindrom (oder so ähnlich gibt (Bsp. 1234321). Ich dachte mir, vielliecht könnte man gut ein Programm dazu schreiben. Wie kann man das Ergebnis vergleichen und erkennen , das es ein Phalindrom ist?

Danke

LuGo

Moderiert von user profile iconNarses: Titel geändert, war: "Werte auslesen und vergleichen (Phalindrome)".


delphi10 - Mi 07.07.10 17:21

Guckst du:
http://de.wikipedia.org/wiki/Palindrom#Erkennung_von_Palindromen
Googlen nach Palindrom und Delphi und du kannst dir die Lösungen aussuchen.


BenBE - Mi 07.07.10 17:40

D2009++:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function IsP(X: Integer): Boolean;
    function NP(X:Integer): Integer; InlineBegin Result := Power(10, Trunc(Log(X))); end;
begin
    If X < 10 Then Exit(-1 < X);
    Result := ((X mod 10) = (X div NP(X))) and IsP((X - (X div NP(X)) * NP(X)) div 10);
end;


k, als Einzeiler (D7+):

Delphi-Quelltext
1:
2:
3:
4:
5:
function IsP(X: Integer): Boolean;
    function NP(X:Integer): Integer; Begin Result := Power(10, Trunc(Log(X))); end;
begin
    Result := IIf(X < 10, -1 < X, ((X mod 10) = (X div NP(X))) and IsP((X - (X div NP(X)) * NP(X)) div 10));
end;


Fiete - Fr 09.07.10 21:14

Moin LuGo,
am einfachsten neue Zahl umdrehen und mit der alten vergleichen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TSpiegelzahl.Umdrehen(Alt:String;var Neu:String);
  var K,LA:Integer;
  begin
   Neu:='';LA:=Length(Alt);
   for K:=LA downto 1 do Neu:=Neu+Alt[K];
  end;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TSpiegelzahl.StartClick(Sender: TObject);
  var Zahl,NeueZahl:String;
  begin
   Zahl:=EditZ.Text;Ausgabe.Clear;
   Ausgabe.Lines.Add(Zahl);Umdrehen(Zahl,NeueZahl);
   Abbruch:=False;
   Screen.Cursor:=crHourGlass;
   repeat
    Ausgabe.Lines.Add(NeueZahl);
    LangAdd(Zahl,NeueZahl,Zahl); // Zahl:=Zahl+NeueZahl - numerisch
    Ausgabe.Lines.Add(Zahl+' - '+IntToStr(Length(Zahl)));
    Umdrehen(Zahl,NeueZahl);
    Application.ProcessMessages;
   until (Zahl=NeueZahl) or Abbruch;
   Screen.Cursor:=crDefault;
  end;


Die procedure TSpiegelzahl.LangAdd(A,B:String;var C:String); mußt du schon selbst entwickeln :wink:
Die Zahl 196 ist für dies Problem :evil:
Gruß
Fiete