Logarithmus-Aufgabe

Lestas89

Bekanntes Mitglied
Ich verstehe folgende Aufgabenstellung nicht. Vllt kann mir da jemand weiterhelfen. Aus dem Buch Grundkurs Java von Dietmar Abts:

Berechnen Sie den kleinsten ganzzahligen Wert von n, sodass 2 hoch n größer oder
gleich einer vorgegebenen ganzen Zahl x ist. Beispiel: Für x = 15 ist n = 4.

Java:
public class Logarithmus {
    public static void main(String[] args) {
        int x = 9;

        int n = 0;
        for (int z = 1; z < x; n++) {
            z *= 2;
        }

        System.out.println(n);
    }
}

Was wird hier genau gemacht? Verstehe das nicht.
 
z wird so oft mit 2 multipliziert, bis z<x nichtmehr gilt, nach jedem Schleifendurchlauf wird n ums eins erhöht. (d.h. am Ende jedes Schleifendurchlaufs gilt z = 2 hoch n)
d.h. die Schleife wird verlassen, falls 2^n = z>=x ist. Und naja, das war ja die Aufgabenstellung.

Edit:

Vielleicht ist dir z*=2; nicht bekannt. Das ist die Kurzschreibweise für z=z*2;
 
Hallo JCODA,

ich danke dir vielmals für deine schnelle Antwort. Was im Quellcode passiert versteh ich nun, doch könntest du mir vllt die Aufgabenstellung in anderen Worten erklären? Irgendwie steig ich nicht dahinter.
 
Es wird genau das gemacht was du im Text schreibst. Es wird in der Schleife z so oft mit 2 multipliziert bis das Ergebnis > x ist. Das was du wolltest

Edit: zu spät 🙂🙂
 
Also der Code wird evtl. etwas unleserlich, da hier eine for Schleife missbraucht wird. Evtl. wird es lesbarer, wenn man den Code umschreibt in eine while Schleife und wenn man Variablen verwendet, die aussagekräftig sind.

Das int z=1 in der for Schleife ist die erstinitialisierung ... Z soll im 2 hoch n sein. Am Anfang ist n =0 und z=2^0=1.
nun wird n immer eins hoch gezählt und d.h. Z muss mal 2 genommen werden. Mathematische Grundlage ist halt: 2^n * 2 = 2 ^ (n + 1)

Und dieses n=n+1 und z=z*2 wird so lange gemacht, bis z endlich größer wie der gegebene Wert ist.
 
Ich hätte doch noch eine Frage:
Java:
public class Logarithmus {
    public static void main(String[] args) {
        int x = 6;

        int n = 0;
        for (int z = 1; z < x; n++) {
            z *= 2;
            System.out.println(z);
        }

       
    }
}

Das z das in der for-Schleife steht bei z < x: Nimmt das z den Wert von z *= 2 an nach jedem Schleifendurchlauf?
 
Das ist ja der Check, der vor jedem Schleifendurchgang durchgeführt wird.
Die for-Schleife läßt sich in eine while Schleife umschreiben - evtl. wird dann alles etwas deutlicher:
Code:
int z = 1;
while (z < x) {
  // Inhalt der for Schleife
  n++;
}

oder wenn man den ganzen Code der main Funktion umschreiben würde, wäre das:
Code:
int x = 6;
int n = 0;
int z=1;
while (z<x) {
  z *= 2;
  System.out.println(z);
  n++;
}

Hilft das?
 
Ja, danke dir. Das hilft. Ich war mir nur nicht sicher ob das z geupdated wird. Aber das z wird ja durch z *= 2 geupdated und da hatte ich Verständnisprobleme.
 

Zurück
Oben