Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 4 Variablen sollen = 1302 sein. (https://www.delphipraxis.net/133136-4-variablen-sollen-%3D-1302-sein.html)

Dave_lernt_Delphi 26. Apr 2009 16:04


4 Variablen sollen = 1302 sein.
 
Hey ihr Delphi- Kenner,
ich habe das Problem, dass ich 4 Variablen habe, die zusammen 1302 sollen:

Delphi-Quellcode:
w * x - y + z = 1302;
Wenn ich das Programm starten möchte sagt Delphi :
Der linken Seite kann nichts zugewiesen werden
Weiß einer von euch, wie ich das Problem beheben kann?
Euer Dave

3_of_8 26. Apr 2009 16:05

Re: 4 Variablen sollen = 1302 sein.
 
Ich habe nicht die geringste Ahnung, was du da tun willst. Soll das eine Zuweisung sein oder willst du die Variablen auf irgendetwas überprüfen?

Dave_lernt_Delphi 26. Apr 2009 16:08

Re: 4 Variablen sollen = 1302 sein.
 
w, x, y und z sollen zusammen 1302 sein...

z.B.
1 * 1302 - 2 + 2 = 1302

Die Muhkuh 26. Apr 2009 16:12

Re: 4 Variablen sollen = 1302 sein.
 
Sieht sehr nach einem Konstrukt mit vier For-Schleifen aus, die solange ausprobieren, bis was gefunden wurde.

Dave_lernt_Delphi 26. Apr 2009 16:13

Re: 4 Variablen sollen = 1302 sein.
 
Genau das meine ich :)
Wie aber kann ich das machen?

rwachtel 26. Apr 2009 16:19

Re: 4 Variablen sollen = 1302 sein.
 
Zitat:

Zitat von Dave_lernt_Delphi
Genau das meine ich :)
Wie aber kann ich das machen?

Code:
var
  w, x, y, z: Integer

[...]

for w := Low(Integer) to High(Integer) do
begin
  for x := Low(Integer) to High(Integer) do
  begin
    for y := Low(Integer) to High(Integer) do
    begin
      for z := Low(Integer) to High(Integer) do
      begin
        if w * x - y + z = 1302 then
        begin
          ShowMessageFmt("%0:d * %1:d - %2:d + %3:d", [w, x, y, z]);
        end;
      end;
    end;
  end;
end;
Das ist aber nicht korrekt, da es eigentlich unendlich viele Lösungen gibt (es sei denn, Du schränkst den Wertebereich ein, so wie ich es hier getan habe).

// Edit: Natürlich kann man das noch optimieren, ist halt ein Quick-and-Dirty-Ansatz, der Deinen Rechner und Dich einige Zeit lang beschäftigen dürfte.

markus5766h 26. Apr 2009 16:45

Re: 4 Variablen sollen = 1302 sein.
 
Hallo,
kann es sein, das "DAS" eine Primfaktoren-Analyse werden soll ?

himitsu 26. Apr 2009 16:55

Re: 4 Variablen sollen = 1302 sein.
 
also erstmal geht soeine Zuweisung garnicht, da es mehrere Lösungen gibt und woher soll Delphi wissen wie was da zugewiesen werden soll.

schon alleine für Folgendes gibt es 13533 Lösungen
Delphi-Quellcode:
var
  x, y, z: Integer;

begin
  for x := -1000 to 1000 do
    for y := x to 1000 do
      for z := -1000000 to 1000000 do
        if x * y + z = 1302 then
          Memo1.Lines.Add(Format('%d * %d + %d = 1302', [x, y, z]));
  Memo1.Lines.Add(Format('%d Lösungen', [Memo1.Lines.Count]));
end;
und das obwohl ich die Wertebereiche eingeschrenkt und doppelte Lösungen ignoriert hab.
x und y kann hier ja getauscht werden, was dann sozusagen fast doppelt soviele Lösungen Ergäbe.

jo, und je mehr Variablen und um so größer der wertebereich .... um so mehr wird es

du kannst ja mal schauen wie lange dieses hier braucht, um alles auszutesten und wie viel Lösungen es dann gibt :angel2:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x, y, z, z2, q: Integer;

begin
  q := 0;
  for x := -1000 to 1000 do
    for y := -1000 to 1000 do
      for z := -1000000 to 1000000 do
        for z2 := -1000000 to 1000000 do
          if x * y + z - z2 = 1302 then
          begin
            if (q < 1000) or (q and $ff = 0) then Memo1.Lines.Add(Format('%d * %d + %d - %d = 1302', [x, y, z, z2]));
            Inc(q);
          end;
    Memo1.Lines.Add(Format('%d Lösungen', [q]));
end;
wobei es hierfür schon eine sehr einfache vereinfachung gibt ... siehe erster Code ... ohne z2 prüfen und dann z nochmals in z-z2 zwelegen

Dave_lernt_Delphi 26. Apr 2009 17:01

Re: 4 Variablen sollen = 1302 sein.
 
// Edit: Ah, da war wohl einer schneller als ich :) (siehe oben)
trotzdem sende ich meine Antwort nochmal ;)


Zitat:

Zitat von markus5766h
Hallo,
kann es sein, das "DAS" eine Primfaktoren-Analyse werden soll ?

Hey, das ist ne gute Idee :thumb:
Muss ich mal machen ... :)
Aber diesmal wird es keine Primfaktorenanalyse... ;)

So, jetzt nochmal 'ne Rückmeldung:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var w, x, y, z : Integer;
begin
for w := Low(1) to High(9) do
begin
  for x := Low(1) to High(9999) do
  begin
    for y := Low(1) to High(9999) do
    begin
      for z := Low(1) to High(9999) do
      begin
        if w * x - y + z = 1302 then
        begin
Label1.Caption := IntToStr(w);
Label2.Caption := IntToStr(x);
Label3.Caption := IntToStr(y);
Label4.Caption := IntToStr(z);
        end;
      end;
    end;
  end;
end;
end;

end.
Das habe ich jetzt geschrieben, man kann das Programm auch starten, wenn man allerdings auf den Button1 klickt passiert nichts und dann kann man garnichts mehr machen, das komplette Programm bleibt stehen und man kann es nicht mehr übers "X" schließen
:gruebel: mhhhhh.... komisch... aber vielleicht kann mir ja nochmal jemand helfen ;) Wäre cool,
Euer Dave

3_of_8 26. Apr 2009 17:16

Re: 4 Variablen sollen = 1302 sein.
 
Low(1) ist wahrscheinlich -2^31 und High(9) ist wahrscheinlich 2^31-1. Das heißt, deine Berechnung braucht seeeehr lange. ;)

markus5766h 29. Apr 2009 20:57

Re: 4 Variablen sollen = 1302 sein.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich glaube nicht, dass sich Dein Programm "aufhängt" -
der Auslastungsanzeige nach arbeitet es, die Frage ist nur, wie lange ??
...hab nach 2 Minuten abgebrochen

jaenicke 29. Apr 2009 21:14

Re: 4 Variablen sollen = 1302 sein.
 
Warum generierst du nicht einfach drei Zufallszahlen und nimmst für die vierte die Differenz zu deinem Zielwert?

3_of_8 29. Apr 2009 21:16

Re: 4 Variablen sollen = 1302 sein.
 
Ähem! 2^128 Schleifendurchläufe, wie ich bereits bemerkt habe. Selbst auf einem absolut utopischen Superrechner dauert das 1348785383850751774 Jahre. ;)

EDIT: Die ganze Aufgabenstellung ist absolut unsinnig. Es ist möglich, in konstanter Zeit ein solches Tupel zu finden und es ist absolut unmöglich, alle zu finden, weil es unendlich viele gibt.

gammatester 29. Apr 2009 21:25

Re: 4 Variablen sollen = 1302 sein.
 
Ist doch völlig trivial, wenn keine Bedingungen gestellt werden (und sollten von den Schleifen auch gefunden werden). Lösunge von w * x - y + z = 1302 dutch hinsehen:

w x y z
0 x 0 1302
0 x 1 1303
....
w 0 0 1302
w 0 1 1303

1 1302 y -y

und so weiter und sofort.

Gammatester

jaenicke 29. Apr 2009 21:35

Re: 4 Variablen sollen = 1302 sein.
 
Zitat:

Zitat von gammatester
und sollten von den Schleifen auch gefunden werden

Werden sie ja auch...
Sobald die 4503599627370496 Durchläufe fertig sind...
Denn High(9) ist 127, denn das ist innerhalb des Datentyps Byte, High(9999) ist 32767, denn das ist im Datentyp Word.
32768 * 32768 * 32768 * 128 = 4503599627370496

Bei schätzungsweise einer halben Milliarde Durchläufe pro Sekunde mit einem modernen PC würde das etwa 4 Tage dauern...

Ohne Low und High mit i := 1 to 9999 usw. würde es immer noch 5 Stunden oder so dauern.

BAMatze 29. Apr 2009 22:03

Re: 4 Variablen sollen = 1302 sein.
 
Also mal zur kurzen Darstellung (was auch schon meine Vorredner erkannt haben) hast du ein 3fach unbestimmtes Gleichungssystem. Dies bedeutet für mich eigentlich nur eins, dass du unendlich viele Lösungen (allein im Bereich der Ganzen- oder Integerzahlen) hast. Nimmst du ein Reales Zahlensystem sollte sich der Raum an möglichen Lösungen um die Potenz Unendlich erweitern.
Dein Vorteil, soweit du die Suche der Möglichen Kombination nicht durch weitere Verknüpfungen einschränkst(z.B. x = 2w, ...), ist die limitierte Verarbeitung deines Rechners mit Zahlen. Also ergibt sich eine berechenbare Anzahl (auch wenn diese ziemlich groß) an Lösungen, was allerdings, wie ich jaenicke entnehme eine "kurze" Weile dauern sollte.

Fazit für dich sollte sein, dass du dir über die Randbedingungen (Mathematische Räume in denen sich deine Zahlen bewegen sollen, Abhängigkeiten einzelner Variablen von anderen und so weiter)klarer wirst. Allerdings ist auch hier etwas Vorsicht zu bewahren, schnell rutscht man mal in den Bereich der komplexen Zahlen und erweitert damit die Anzahl an Lösungen warscheinlich um eine Dimension unendlicher Lösungen.

Ps.: ich weiß mathematisch gesehen sind hier leichte Ungenauigkeiten enthalten, was allerdings aufgrund der Verständlichkeit für Laien zu verschmerzen sein sollte. Möchte das hier nicht in eine theoretisch mathematische Diskusion ausarten lassen, in der über Theorien wie "Ist Unendlich hoch irgendwas nicht immer noch Unendlich" oder oder oder. Ich denke der Punkt, die Aufgabenstellung vieleicht nochmal zu überdenken ist damit verständlich rüber gekommen.

BAMatze

jfheins 29. Apr 2009 22:04

Re: 4 Variablen sollen = 1302 sein.
 
Ich hab da auch ne Lösung :stupid:
Delphi-Quellcode:
function Get_w(): Integer;
begin
  Result := 20;
end;

function Get_x(): Integer;
begin
  Result := 70;
end;

function Get_y(): Integer;
begin
  Result := 100;
end;

function Get_z(): Integer;
begin
  Result := 2;
end;

// Aufruf:

procedure evaluate;
begin
  Result := Get_w * Get_x - Get_y + Get_z; // ergibt 1302
end;
Und das sogar in konstanter Zeit (= O(1) ) wenn nicht gar schneller ;)

mr_emre_d 29. Apr 2009 22:05

Re: 4 Variablen sollen = 1302 sein.
 
Ich kenne ne Möglichkeit, die schneller als deine wäre ;)
(deine beinhaltete zu viele Jumps & Push/Pops) :P

MfG

jaenicke 30. Apr 2009 00:22

Re: 4 Variablen sollen = 1302 sein.
 
Zitat:

Zitat von BAMatze
Also ergibt sich eine berechenbare Anzahl (auch wenn diese ziemlich groß) an Lösungen, was allerdings, wie ich jaenicke entnehme eine "kurze" Weile dauern sollte.

Naja, um genau zu sein geht jede Zahl für drei der Variablen, wenn man die vierte daraus berechnet.

Deshalb ist eben wirklich die Frage was das ganze für einen Sinn hat. :stupid:

Dave_lernt_Delphi 1. Mai 2009 08:03

Re: 4 Variablen sollen = 1302 sein.
 
Das finde ich wirklich 'ne gute Idee, ich werde das jetzt mal ausprobieren.
Vielen Dank für die reichlichen Antworten und Ideen zum Thema.
Euer Dave

Dave_lernt_Delphi 1. Mai 2009 08:45

Re: 4 Variablen sollen = 1302 sein.
 
@jfheins:
Wie kann ich denn dann die Zahlen ausgeben,
die errechnet wurden?
Viele Grüße Dave

BAMatze 1. Mai 2009 09:19

Re: 4 Variablen sollen = 1302 sein.
 
Zitat:

Zitat von Dave_lernt_Delphi
@jfheins:
Wie kann ich denn dann die Zahlen ausgeben,
die errechnet wurden?
Viele Grüße Dave

Also wenn ich nicht allzu müde noch bin und ich mich nicht ganz irre, stellt diese Lösung dort nur 1 von unendlich vielen dar. und zwar mit folgenden Werten:

w = 20
x = 70
y = 100
z = 2

Möchte dir nur mal die Tragweite der Möglichen Lösungen darstellen.

Variable 1.Mögliche Kombination 2. 3. 4. 5. 6. ....

w 1 1 1 1 1 1
x 1 1 1 1 1 1
y 1 2 3 -1 -2 -3
z 1302 1303 1304 1300 1299 1298

Alle diese Werte LÖSEN dein Problem und es geht wie man sieht für w unendlich viele Werte, x unendlich viele, y unendlich viele und z ergänzt das ganze einfach nur. Grob gesagt, wie ich schon mal in einem vorherigen Beitrag geschrieben hatte sind das mindestens unendlich hoch 3 (grobe Schätzung) verschiedene Kombinatonen. Wie gesagt, die eingeschränkte Technik (die maximale Größe für Integerzahlen) hilft dir dort eingeschränkt.

Um dir das nochmal (auch wenn es andere schonmal geschrieben haben) klar zu machen, bedeutet das, und ich gehe davon aus du hast ein auf 32 Bit basierendes System bedeutet es (wenn mich meine Kenntnisse verlassen) du hast für w 2^32 verschiedene Werte, für x 2^32 und für y 2^32 und wie gesagt z ergänst das ganze nur. 2^32 bedeutet dabei 4294967296 verschiedene Zahlen, ist schonmal "etwas" kleiner als Unendlich. das bedeutet für dich du hast mindestens 4294967296^3 verschiedene mögliche Kombinationen. Was in etwa 7,9*10^28 sind und dabei hab ich noch abgerundet!! Bist du dir WIRKLICH sicher, dass du diese Aufgabe so weiterhin bestehen lassen möchtest?

Und zur Veranschaulichung nur nochmal:

Du hast 79000000000000000000000000000 verscheidene Möglichkeiten ( hoffe ich hab mich bei den Nullen nicht vertan, sollten 27 sein, die 9 ist ja die 28.Stelle)

MfG
BAMatze

hadschi92 1. Mai 2009 09:57

Re: 4 Variablen sollen = 1302 sein.
 
Willst du wirklich ausrechnen, welche Werte die 4 Variablen annehmen können? Oder hast du die Variablen davor definiert und willst dann überprüfen ob sie die Zahl 1302 ergeben?

Das wäre nämlich sehr, sehr einfach:
Delphi-Quellcode:
if (w * x - y + z) = 1302 then
  //hier Befehl wenn die Zahlen 1302 ergeben
Edit: Ich verweise auf einen Thread von dir: http://www.delphipraxis.net/internal...t.php?t=154631


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz