![]() |
Zahlen symmetrisch
hab wieder mal ein problem, ich wollte einfach ma ausprobiern was ich so alles mit zaheln kann und hab geguckt ob ich herausfinden kann ob eine zahl symmetrisch ist oder nicht.
hierbei musste ich allerdings festellen das ich das nicht hinkrieg. ich weis einfach nicht wie ich es abfragen soll und wollte hier wissen ob mir jmd helfen kann. also: biem anwenden des programms gebe ich irgendeine zahl in ein editfeld ein und drueck auf einen button, hier bei soll dann (z.b) label9.caption:='symmetrisch'; zumindestens hab ich mir das so vorgestellt nur weis ich nicht genau wie ich das abfragen soll. ich wuerd das gern ungefair so machen lg andy :dp: |
Re: Zahlen symmetrisch
Du meinst Primzahlen?
|
Re: Zahlen symmetrisch
>.< habs grad bemerkt das ich von primzahlen rede.
sry aber ja meine symmetrische zahlen. |
Re: Zahlen symmetrisch
Hallo,
mich mal eben kundig gemacht habe, da Begriff Symmetrische Zahlen mir kein Begriff war..Du meinst also "Wir wollen eine natürliche Zahl „symmetrisch" nennen, wenn ihre Zifferndarestellung von rechts gelesen ebenso lautet wie von links. Dabei soll stets auch die 0 als Anfangsziffer mitberücksichtigt werden. So sind z.B. 15251, 037730 und 0000 symmetrische Zahlen." dies? |
Re: Zahlen symmetrisch
Hmmm ... was Du meinst sind Primzahlen. Hab noch nie den Begriff von "symmetrische Zahl" gehört. Naja, die einfachste Methode ist folgende:
Du willst prüfen ob die Zahl z eine Primzahl ist. Also ermittelst Du alle Zahlen x zw. 2 und z-1 und schaust nach, ob z modulo x = 0 ist:
Delphi-Quellcode:
Das Problem ist übrigens auch als Faktorisierungsproblem bekannt. Eine effiziente Lösung ist nicht existent. Allerdings kannst Du den Aufwand für den Bruteforce Ansatz verringern. Du musst z.B. prinzipiell nicht bis z-1 testen sondern nur bis Wurzel aus z etc.. Aber das führt zu weit.
function IstPrimzahl(z : integer) : boolean;
var i : integer; begin result := true; for i := 2 to z-1 do if z mod i = 0 then begin result := false; exit; end; end; Für was magst das ganze denn verwenden? |
Re: Zahlen symmetrisch
Eine mathematische Formel für symmetrische Zahlen kenne ich jetzt nicht, aber wenn Du sie als String betrachtest, solltest Du der Lösung schnell nahe kommen.
|
Re: Zahlen symmetrisch
Delphi-Quellcode:
function isPrime(Zahl: Integer): Boolean;
var Temp: Integer; begin Temp := 2; while ((Zahl mod Temp) <> 0) and (Zahl > Temp) do inc(Temp); result := Zahl = Temp; end; |
Re: Zahlen symmetrisch
Hallo! Symmetrische Zahlen, nicht Primzahlen :P
|
Re: Zahlen symmetrisch
Zitat:
Ist zB die 8 eine symmetrische Zahl? Oder meint der sowas wie 123321? |
Re: Zahlen symmetrisch
Siehe #4. 12345 ist nicht symmetrisch, 12321 hingegen schon. Du kannst auch mal nach Palindrom schauen ;)
|
Re: Zahlen symmetrisch
Zitat:
|
Re: Zahlen symmetrisch
Ja, beschrieben hat er aber Primzahlen. Aber für symetrische Zahlen gibts ne einfache Methode:
Delphi-Quellcode:
uses sysutils;
function IstSymetrisch(z : integer) : boolean; var i : integer; s : string; begin result := true; s := IntToStr(z); for i := 1 to Length(s) do result := result and (s[i] = s[length(s) - (i - 1)]); end; |
Re: Zahlen symmetrisch
ohje... das geht mir hier zu schnell^^
und wenn dann noch der erste beitrag editiert wird... aber zum thema:
Delphi-Quellcode:
hab mal so erfunden^^
isSymmetrisch(Zahl: String{!}): Boolean;
var Anfang, Ende: Integer; begin Anfang := 1; Ende := length(Zahl); if not odd(length(Zahl)) then begin while (Zahl[Anfang] = Zahl[Ende]) and (Anfang < Ende) do begin Inc(Anfang); Dec(Ende); end; result := Anfang > Ende; end else result := False; end; |
Re: Zahlen symmetrisch
Liste der Anhänge anzeigen (Anzahl: 1)
Mist eigentlich wär ich vor allen gewesen ....
wollte nur, dass es auch gut aussieht ^_^ Hmpf.. |
Re: Zahlen symmetrisch
Noch ein Vorschlag:
Delphi-Quellcode:
uses StrUtils;
function IsSymmetricNumber(const i: Cardinal): Boolean; begin Result := IntToStr(i) = ReverseString(IntToStr(i)); end; |
Re: Zahlen symmetrisch
Funktioniert nur nicht immer ^^
123321 geht 1234321 geht nicht |
Re: Zahlen symmetrisch
Wie kommst Du zu dieser Annahme?
|
Re: Zahlen symmetrisch
Oh stimmt sry ...
... kleiner Denkdreher ^^ :cyclops: |
Re: Zahlen symmetrisch
Zitat:
Man kann Primzahlen auch "aussieben", oder diese nach Fermat testen. //Edit: Stop! Wenn ich mich recht erinnere, prüfen Siebmethoden und der Test nach Fermat nur nach Pseudoprimzahlen! |
Re: Zahlen symmetrisch
Du bist des Lesens mächtig?
Zitat:
|
Re: Zahlen symmetrisch
also hab mir eure beispiele ma angesehen und hab mir dann was eigenes ueberlegt.
habs erst damit probiert:
Delphi-Quellcode:
(also das man 5 verschiedene Zahlen schreiben kann)
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer; begin eins:=StrToInt(edit1.text); zwei:=StrToInt(edit2.text); drei:=StrToInt(edit3.text); vier:=StrToInt(edit4.Text); fuenf:=StrToInt(edit5.Text); If eins + zwei = vier + fuenf then begin Label3.Visible:=StrToBool('False'); Label2.Visible:=StrToBool('True'); end else begin Label2.Visible:=StrToBool('False'); Label3.Visible:=StrToBool('True'); end; end; so wenn ich dann auf den button clicke ist zb. 12321 = symmetrisch und 12231 = nicht symmetrisch allerdings hab ich dann bemerkt das es auch einen kleine fehler gib.t da es ja den wert des 1. felds mit dem 2. zusammen rechnet und mit der summe des 4. + 5. felds vergleicht. so würde das programm also ausgeben das, zb. 12312 = symmetrisch ist. also bin ich nochmal dran gegangen und hab einen anderen weg gesucht, in diesem fall is mir dann eine ganz einfache lösung eingefallen und wollte fragen ob man das so machen kann oder ob es da auch sowas wie einen "Bug" gibt.
Delphi-Quellcode:
hier wird vergliechen ob
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer; begin eins:=StrToInt(edit1.text); zwei:=StrToInt(edit2.text); drei:=StrToInt(edit3.text); vier:=StrToInt(edit4.Text); fuenf:=StrToInt(edit5.Text); If (eins = fuenf) and (zwei = vier) then begin Label3.Visible:=StrToBool('False'); Label2.Visible:=StrToBool('True'); end else begin Label2.Visible:=StrToBool('False'); Label3.Visible:=StrToBool('True'); end; end; edit1.text = edit5.text ist und ob edit2.text = edit4.text ist richtig so? (noch nebenbei, klingt jetzt wahrschienlich etwas dumm oder so, aber ich hab des immer noch nicht kapiert wie ich eine function einbauen kann, kann mir jemand helfen, bzw. zeigen oder einen link zu einem tut geben?) |
Re: Zahlen symmetrisch
Der 2. Ansatz ist auf jeden Fall richtiger, wenn auch umständlich gelöst. Versuch es mal so:
Delphi-Quellcode:
Und zum Einsetzen von Funktionen solltest Du Dir die Einsteiger-Tutorials in diesem und anderen Foren mal ansehen. Ein kleines Beispiel:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer; begin //Du solltest hier auf jeden Fall eine Fehlerbehandlung einbauen eins:=StrToInt(edit1.text); zwei:=StrToInt(edit2.text); drei:=StrToInt(edit3.text); vier:=StrToInt(edit4.Text); fuenf:=StrToInt(edit5.Text); //sprechende Bezeichner wären auch nicht schlecht ;) Label2.Visible := (eins = fuenf) and (zwei = vier); Label3.Visible := not Label2.Visible; { If (eins = fuenf) and (zwei = vier) then begin Label3.Visible:=StrToBool('False'); Label2.Visible:=StrToBool('True'); end else begin Label2.Visible:=StrToBool('False'); Label3.Visible:=StrToBool('True'); end;} end;
Delphi-Quellcode:
function IsSymmetricNumber(const i: Cardinal): Boolean;
begin Result := IntToStr(i) = ReverseString(IntToStr(i)); end; procedure TForm1.Button1Click(Sender: TObject); var eins, zwei, drei, vier, fuenf: Integer; begin //Du solltest hier auf jeden Fall eine Fehlerbehandlung einbauen eins:=StrToInt(edit1.text) * 10000; zwei:=StrToInt(edit2.text) * 1000; drei:=StrToInt(edit3.text) * 100; vier:=StrToInt(edit4.Text) * 10; fuenf:=StrToInt(edit5.Text); if IsSymmetricNumber(eins + zwei + drei + vier + fuenf) then ShowMessage('Palindrom') else ShowMessage('Kein Palindrom'); end; |
Re: Zahlen symmetrisch
Zitat:
und zu dem was du veraendert hast soll alles soviel heisen wie(kommt unten drunter).... wenn ich das richtig verstanden habe. // Fehlerbehandlung damit meinst du einfach eine fehlerbehandlung xP, weis nicht genau was aber ich würde einfach vermuten wenn zb. edit1.text = nix ist, also einfach nur leer (ich habe bei jedem edit feld im "OnKeyPress" eine procedure eingefügt das man nur zahlen reinschreiben kann.) bzw. zu dem hier werd ich noch sehen, da mir momentan grad dazu nichts einfällt. ab // sprechende Bezeichner wären..... wird das wohl so erklärt: Label2 ist nur visible (sichtbar) wenn eins = fuenf (der wert im editfeld) und zwei = vier ist. und Label3 ist nur visible (sichtbar) wenn label2 nciht sichtbar ist. hoffe das ich das dann richtig verstanden hab. allerdings muss ich sagen momentan find ich das auf meine methode noch einfacher ^^ naja liegt wohl daran das ich das kann und noch net sooo weit gedacht hab ^^ |
Re: Zahlen symmetrisch
Lass mal ein Edit leer und drück den Button, dann weißt Du, was ich mit Fehlerbehandlung meinte. Und mit sprechenden Bezeichnern meine ich, statt Label22 einen Namen wie lblVorname (nur als Beispiel) zu wählen, dann kann man evtl. auch ohne das Formular zu kennen auf den Sinn schließen ;)
|
Re: Zahlen symmetrisch
ja des mit edit leer lassen kommt halt mit dem problem
" is not a valid integer value. muss ich halt noch gucken das dann entweder nichts kommt oder eine andere error nachricht. bzw. habs so probiert funktioniert allerdings net, :wall:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var eins, zwei, drei, vier, fuenf: Integer; begin eins:=StrToInt(edit1.text); zwei:=StrToInt(edit2.text); drei:=StrToInt(edit3.text); vier:=StrToInt(edit4.Text); fuenf:=StrToInt(edit5.Text); // Das hier sollte die Fehlerbehandlung sein If (eins or zwei or drei or vier or fuenf =$22) then Showmessage('Bitte fülle alle Felder aus!') // ende der Fehlerbehandlung else If (eins = fuenf) and (zwei = vier) then begin Label3.Visible:=StrToBool('False'); Label2.Visible:=StrToBool('True'); end else begin Label2.Visible:=StrToBool('False'); Label3.Visible:=StrToBool('True'); end; end; |
Re: Zahlen symmetrisch
Schau Dir mal TryStrToInt an.
|
Re: Zahlen symmetrisch
Oder
![]() |
Re: Zahlen symmetrisch
Dann weißt Du aber nicht, ob die Zahl eingegeben wurde oder nicht ;)
|
Re: Zahlen symmetrisch
versuchs mal so:
Delphi-Quellcode:
uses
StrUtils; // Uses ergänzen function IsSymmetricNumber(const s: String): Boolean; begin Result := s = ReverseString(s); end; procedure TForm1.Button1Click(Sender: TObject); var Temp: Integer; // Dummyvariable s: String; begin s := edit1.text + edit2.text + edit3.text + edit4.text; // wenn du das ganze mit nur einem edit machen willst dann // s := edit1.text; if TryStrToInt(s, Temp) then // wenn in s eine zahl drinnsteht... begin Label2.Visible := IsSymmetricNumber(s); Label3.Visible := not Label2.Visible; end; end; |
Re: Zahlen symmetrisch
ok thx für die hilfe.
hab es jetzt auch geschaft bei mir im code einen fehler error einzubauen falls nicht alle editfelder *edit* meine ausgefüllt sind. hab jetzt einfach das hinzugefügt.
Delphi-Quellcode:
try
eins:=StrToInt(edit1.text); zwei:=StrToInt(edit2.text); drei:=StrToInt(edit3.text); vier:=StrToInt(edit4.Text); fuenf:=StrToInt(edit5.Text); except ShowMessage('Bitte Fülle alle Felder aus!'); abort; end; |
Re: Zahlen symmetrisch
*mal ein wenig aufräumt* *g*
Zitat:
Delphi-Quellcode:
Kreativ :mrgreen: *scnr* .
StrToBool('False');
Wenn ich das richtig sehe, berücksichtigt keine bisher gepostete Funktion die "Nullen-Regel" (s. #4). Dafür sollte aber ein einfaches Entfernen aller anhängenden Nullen genügen. |
Re: Zahlen symmetrisch
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz