Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] function...

Einklappen

Neue Werbung 2019

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

  • [Erledigt] function...

    Hallo,

    ich habe z.B. die Nummer 32 und moechte pruefen ob diese wenn ich sie mehrmals durch 2 teile zum schluss die Nummer 1 ergibt.

    Bei der Nummer 18 z.B. mehrmals geteilt das Ergebniss durch 2 kommt nie die 1
    als Endergebniss.

    Gibt es dafuer eine Php funktion oder muss ich selber was schreiben?

    Vielen Dank !!!


  • #2
    PHP-Code:
    function blabla($num){
      
    $num = (int) $num;
      while(
    true){
        if(!
    is_int($num)) return false;
        if(
    $num == 1) return true;
        
    $num /= 2;
      }

    Edit: Bissl mehr Errorhandling:

    PHP-Code:
    function blabla($num){
      
    $num = (int) $num;
      if(
    $num == 0) return false;
      while(
    true){
        if(!
    is_int($num)) return false;
        if(
    abs($num) == 1) return true;
        
    $num /= 2;
      }

    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      -- edit -- blödsinn geredet
      Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

      Kommentar


      • #4
        Danke aber ich habe mich gefragt ob es eine PHP-Funktion dafuer gibt die das ganze automatisch berechnet...

        Kommentar


        • #5
          Wie wäre es rekursiv?

          PHP-Code:
          function by2($num) {
            if (
          $num 1) {
              return 
          by2($num 2);
            else if (
          $num == 1) {
              return 
          $num;
            }
            return 
          0;

          Edit: Was soll denn der Sinn dieser Information sein?
          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

          Kommentar


          • #6
            Edit: Achso nein, doch auch Blödsinn. Hab wo anders hingedacht.

            Kommentar


            • #7
              Was ist denn das für eine Hausaufgabe?

              Rekursiv um festzustellen ob es sich um eine 2er-Potenz handelt?

              Eine fertige Funktion fällt mir da nicht ein.
              Es geht aber schneller:
              PHP-Code:
              function is2pot($i) {
                return (bool)
              preg_match('/^100*$/',decbin($i));

              PHP-Klassen auf github

              Kommentar


              • #8
                @Tropi

                Dürfte nicht klappen:

                z.B 36/2=18 -》gerade
                18/2 = 9 -》 ungerade
                Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden.
                - Linus Torvalds

                Kommentar


                • #9
                  Wenn eine zahl (x) so lange durch zwei teilbar ist, dass es auf 1 endet, heißt das im umkehrschluss, dass ich von der 1 durch "mal zwei nehmen" zu der zahl kommen muss.

                  Wie heißt "wiederholtes mal zwei nehmen"? Richtig: potenzieren. 2^x also.

                  32 = 2^4

                  Bei 18 geht das nicht.

                  Alles, was also festgestellt werden muss, ist, ob die Zahl durch 2^x darstellbar ist.

                  Wenn wir nun die binärdarstellung und binäre operatoren nutzen, ist das relativ simpel. Wenn x eine zweierpotenz ist, dann ist die binärdarstellung IMMER eine "1" mit folgenden nullen.

                  Sprich, alles was wir prüfen müssen ist, ob die zahl binär so aussieht. Dafür nehmen wir die zahl minus 1. Wenn die zahl eine zweierpotenz ist, wird das dazu führen, dass alle 0en zu einer 1 werden und die führende 1 wegfällt.

                  Wenn wir diese beiden Sachen gegeneinander UND nehmen, wird dementsprechen überall 0 rauskommen. Bei JEDER anderen Zahl ist das nicht der Fall, da hier irgendwo eine 1 übrig bleiben wird.

                  In code gefasst:

                  PHP-Code:
                  function isAlwaysDivisibleByTwo($num) {
                      
                  $num = (int)$num;
                      return (
                  $num & ($num 1)) === 0;

                  Voila. Keine Schleifen, keine Rekursion. Nur ein bisschen bit-magie

                  PS: Frei übersetzt und erklärt nach http://stackoverflow.com/questions/6...s-a-power-of-2
                  Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

                  Kommentar


                  • #10
                    28 > 14 > 7 > 3.5 > *tilt*
                    [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                    Kommentar


                    • #11
                      ApoY2k: Die Note 1 knapp verfehlt. Die Zahl 1 liefert für deine lösung auch true, wenn ich die durch 2 teile kommt aber 0,5 raus.
                      Aufgabe: Mehrmals durch 2 teilen, also mind. 1x.

                      LG dein Oberlehrer
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Hmmm okay, das ist aber nun wirklich trivial durch ein vorgestelltes (logisches) und lösbar ^^

                        PHP-Code:
                        function isAlwaysDivisibleByTwo($num) {
                            
                        $num = (int)$num;
                            return (
                        $num 1) && (($num & ($num 1)) === 0);

                        Lerne Grundlagen | Schreibe gute Beispiele | PDO > mysqli > mysql | Versuch nicht, das Rad neu zu erfinden | Warum $foo[bar] böse ist | SQL Injections | Hashes sind keine Verschlüsselungen! | Dein E-Mail Regex ist falsch

                        Kommentar


                        • #13
                          Zitat von ApoY2k Beitrag anzeigen
                          Hmmm okay, das ist aber nun wirklich trivial durch ein vorgestelltes (logisches) und lösbar ^^

                          PHP-Code:
                          function isAlwaysDivisibleByTwo($num) {
                              
                          $num = (int)$num;
                              return (
                          $num 1) && (($num & ($num 1)) === 0);



                          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                          Kommentar


                          • #15
                            Jede neue Version muss erst durch ihn abgenommen werden.
                            Relax, you're doing fine.
                            RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                            Kommentar

                            Lädt...
                            X