Informatisch Mathematisches Problem (o.ä.)

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

  • Informatisch Mathematisches Problem (o.ä.)

    (Mir ist kein passenderer Topic eingefallen.)

    Hallo Leute,

    im Grunde ist es ein recht einfaches Prinzip, aber ich komme einfach auf keine sinnvolle Lösung.

    Ich habe X Variablen mit festgelegten Werten. Die erste Variable hat den Wert 1, die zweite den Wert 2, die dritte den Wert 4, die vierte den Wert 8 usw. (Immder eine Verdopplung der vorangegangene Variable.)

    Um das Ganze etwas einfacher zu halten, gehen wir mal davon aus, dass wir Anfangs nur 4 Variablen haben:

    var A = 1
    var B = 2
    var C = 4
    var D = 8

    Wenn man nun X dieser Variablen kombiniert (wobei jede Variable nur einmal vorkommen darf) erhält man durch Addition der Werte das Ergebnis Y.

    Also z.B.:
    $Y=$A+$C; $Y=5
    $Y=$C+$D+$B; $Y=14
    usw.

    Egal wie man kombiniert, jede Kombination (var Y) hat einen eindeutigen Endwert. (Durch die Verdopplung der Variablenwerte bei der Definition.)

    Somit gibt es in diesem Fall (4 Ursprungsvariablen) insgesamt 15 Kombinationsmöglichkeiten.

    Das sollte eigentlich verständlich sein. Kommen wir also zum Problem:

    Ich benötige eine Funktion, die das Ganze rückwärts macht.

    Also z.B.:

    PHP-Code:
    function MachDas($y)
     {
       
    $erg=blah blah blah;
        return 
    $erg;
      } 
    Wenn ich also für Y den Wert 7 übergebe, muss ich als Ergebnis z.B. ein Array erhalten (oder sonst etwas) $arr('A','B','C')

    Oder wenn ich 9 übergebe dann eben $arr('A','D')

    Die Funktion soll praktisch ermitteln, aus welchen Variablen der Wert Y gebildet wurde. (Und da es für jeden Y-Wert eine einzige Kombinationsmöglichkeit gibt ...)

    Bis jetzt habe ich das ganze in einer Select-Anweisung laufen. Bei 4 Ursprungsvarialben ist das noch nicht so der Akt, da es ja nur 15 Möglichkeiten und somit 15 Case-Fälle gibt. Wenn jedoch ein, zwei oder drei weitere Variablen hinzukommen, wird das gigantisch. (Bei 5 Variablen sind es 31 Möglichkeiten, bei 6 sind es 63 und bei 7 bereits 127 Möglichkeiten.)

    Die Funktion sollte also möglichst universell sein. Jedoch begnüge ich mich natürlich auch mit einer Lösung für nur 4 Variablen; die umzuschreiben müsste mir eigentlich gelingen.

    Ach ja, die Werte für var A, var B, var C, var D (usw.) sind der Funktion natürlich bekannt.

    Vielen Dank schon mal im Vorraus,

    DasD

  • #2
    machs rekusiv:

    bei 9 müsstest du halt das größe rausfinden was reinpasst: 8
    9-8 = 1
    bei 1 ist klar: 1

    Array(8,1);

    Kommentar


    • #3
      achso, *verschieb*

      Kommentar


      • #4
        wie wärs mit decbin

        Offe

        Kommentar


        • #5
          @TobiaZ: Vielen Dank Dass das irgendwie rekursiv gehen muss, war mir klar. Aber irgendwie sah ich da keine vernünftige Lösungsmöglichkeit. Dein Posting ließ plötzlich ein Lichtlein bei mir aufgehen

          Falls es jemanden interessieren sollte, hier die Funktion: (Und falls es noch einfacher gehen sollte, lasse ich mich gerne belehren.)

          PHP-Code:
          function SprachenDecode($sprachen)
             {
              for (
          $count=$SPTXT[0][0]; $count>0$count--)
               {
                if (
          $sprachen-$SPTXT[$count][1]>=0)
                 {
                  
          $sprachen=$sprachen-$SPTXT[$count][1];
                  
          $zwisp[$count]=1;
                 }
                else
                 {
                  
          $zwisp[$count]=0;
                 }
               }
              return 
          $zwisp;
             } 
          $SPTXT[0][0] beinhaltet die Anzahl der aktiven Sprachen
          $SPTXT[x][1] beinhaltet den Wert der Sprache (1, 2, 4, 8 usw.)

          Und dieses "x" steht für die Nummer der Sprache, von 0 bis $SPTXT[0][0] halt.

          @Offe1: Wie sollte mir das weiterhelfen? Komme in meinem Fall auf keine Idee, die mein Problem gelöst hätte.

          Und im Array $zwisp erhalte ich dann für jede Sprache eben eine 1 oder 0, je nachdem, ob diese vom User akzeptiert wird oder nicht.

          DasD

          Kommentar


          • #6
            Re: Informatisch Mathematisches Problem (o.ä.)

            Mal deine Sachen ein wenig ergänzt:

            var A = 1 = 2^0
            var B = 2 = 2^1
            var C = 4 = 2^2
            var D = 8 = 2^3

            Also z.B.:
            $Y = $A+$C
            $Y = 5
            $Y = 0101

            $Y = $C+$D+$B
            $Y = 14
            $Y = 1110

            Wie du siehst gibt's da Binärzahlen - im Format: DCBA (Standard bei Binärzahlen)

            und wie Offe dir gepostet hat, kannst du mit decbin / bindec zwischen den Binärzahlen und den Dezimalzahlen umrechnen.

            Arrays brauchst du dann nicht mehr - viel zu kompliziert.
            hopka.net!

            Kommentar


            • #7
              ungetestet
              PHP-Code:
              function &zurueck($_param,$_max=10){
                 
              $array = array();
                 for(
              $i=0;$i<$_max;++$i)
                    if(
              $x=pow(2,$i)*(($_param>>$i)%2))
                       
              $array[]=$x;
                 return 
              $array;

              TBT

              Die zwei wichtigsten Regeln für eine berufliche Karriere:
              1. Verrate niemals alles was du weißt!


              PHP 2 AllPatrizier II Browsergame

              Kommentar

              Lädt...
              X