Ankündigung

Einklappen
Keine Ankündigung bisher.

Alle Zahlen, die eine bestimmte Bedingung erfüllen, ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Alle Zahlen, die eine bestimmte Bedingung erfüllen, ausgeben

    Hallo liebe Forumsmitglieder,

    ich bin vor drei Tagen auf ein Problem gestoßen, dass ich versucht habe zu beheben aber es nicht hinbekomme:

    Ich habe vier Variablen (a, b, c, x). Nun sollen alle Zahlen ausgegeben werden, die eine bestimmte Bedingung erfüllen (a+b+c = a*b*c-x), wobei der Nutzer x angibt. Jetzt habe ich einen Code geschrieben, allerdings ist der Server damit überlastet. Hier mein Code:

    PHP-Code:
    $operation $_POST['operation'];
    $x $_POST['x'];
    $a 1;
    $b 1;
    $c 1;
    if (
    $operation == "-") {
        while (
    $c <= $a+$b+$c+$x) {
            while (
    $b <= $a+$b+$c+$x) {
                while (
    $a <= $a+$b+$c+$x) {
                    if (
    $a+$b+$c == $a*$b*$c-$x) {
                        echo 
    $a "+" $b "+" $c "=" $a "*" $b "*" $c "-" $x;
                    }
                    
    $a $a++;
                }
                if (
    $a+$b+$c == $a*$b*$c-x) {
                    echo 
    $a "+" $b "+" $c "=" $a "*" $b "*" $c "-" $x;
                }
                
    $b $b++;
            }
            if (
    $a+$b+$c == $a*$b*$c-x) {
                echo 
    $a "+" $b "+" $c "=" $a "*" $b "*" $c "-" $x;
            }
            
    $c$c++;
        }

    Dass die Variablen richtig übergeben werden habe ich geprüft.
    Habt ihr einen Vorschlag, wie das schonender geht?
    Danke für Eure Antworten!

    Viele Grüße
    Nymus

  • #2
    Dein Server ist aus einem ganz speziellen Grund überlastet.

    Schau dir mal deine Bedingung der While schleife an.

    in der ersten "Runde" sind $a,$b,$c jeweils gleich eins. Aus Vereinfachungsgründen nehmen wpr für $x auch eins.

    hieraus ergibt sich die Bedingung ($c)1 <= $a(1) + $b(1) + $c(1) + $a(1) Das ist dann gleich 1 < 4 die ist WAHR also wird die Schleife ausgeführt.
    Wenn du dann jede Runde $c um eins Erhöhst wird diese Bedingung auch immer Wahr bleiben. Denn in der zweiten Runde steht da 2 < 5 dann 3 < 6 usw. Du hast also keine effektive Abbruchbedingung für die Schleife und somit ein unendliches PHP Script damit wäre dann jeder Server überlastet

    Den Fehler hast du übrigens in allen drei while Schleifen gemacht. Im Prinzip kann man sich merken, wenn ein Script unendlich lange läuft hat man zu 99% irgendwo eine immer Wahre Bedingung eingebaut.

    Kommentar


    • #3
      Mach doch einfach:

      if(a + b + c = a * b * c - x){}

      Die $ hab ich hier aus tastaturtechnischen gründen weggelassen

      #Tapatalk

      Kommentar


      • #4
        Nun sollen alle Zahlen ausgegeben werden
        Wirklich "alle" Zahlen ?

        Dir ist schon bewusst, das Zahlen ins unendliche gehen, oder?

        Selbst wenn du auf 32 bit integer begrenzt, wird die Probenrechnung wohl ein ganzes Weilchen dauern, da du alle Kombinationen dieser Zahlen durchgehen musst, das wären 2^4 * 2^32 Kombinationen und zu jeder Kombination eine Addition und eine Multiplikation durchführen.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Hey!

          Danke für Eure Antworten!

          @Istegelitz:
          Irgendwann gibt es keine Überschneidungsmenge mehr, was heißt, dass es keine Möglichkeiten mehr gibt. Trotzdem Danke!

          @TessaKavanagh:
          Danke!! Jetzt sehe ich es. Nur muss ich jetzt überlegen, wie ich es mache!

          Bei Vorschlägen bitte posten!
          Danke.

          Viele Grüße
          Nymus

          Kommentar

          Lädt...
          X