C# Zahl immer weiter verdoppeln?
Also ich habe mich gefragt wie man am besten eine Zahl immer weiter verdoppeln (1-2-4-8-16-32-64…)kann und sie dann in der Konsole ausgeben(Habe es zwar hinbekommen,jedoch nicht optimal gelöst.)
Danke😀
5 Antworten
int zahl = 1;
for(int i = 0; i < Anzahl; i++)
{
Console.WriteLine(zahl);
zahl = zahl * 2;
}
Das gibt das ganze jetzt so oft aus wie Anzahl groß ist. Also bei Anzahl=3 bekommst du 1,2,4
Die Multiplikation mit 2 kannst du auch durch einen Linksshift lösen aber in dem Fall sollte es der Compiler ohnehin zu einem optimieren.
Bis auf eine Kleinigkeit: Shift schreibt sich nicht mit Sch. ^^
Ich weiß. Keine Ahnung warum ichs mit sch geschrieben habe. Wohl unterbewusste eindeutschung
Hallo,
In Assembler Hätte ich ein Register mit einer 1 genommen und es immer ein Bit nach links geschoben (shift-befehl). Ds entspricht einer Multiplikation mit 2.
Man kann aber auch innerhalb einer Schleife von 0..n
immer 2^n nehmen
MFG
Harry
Bitte poste Deinen Code.
Das kann man sehr einfach in einer rekursiven Schleife lösen.
Achte jedoch auf eine Abbruchbedingung, sonst hast Du entweder eine Endlosschleife oder Deine Zahl erreicht einen Bereich, den die Variablendefintion nicht mehr verarbeiten kann.
Ich würde hier eine normale Schleife nutzen und keine Rekursive sonst erzeugt man nur unnötig hohen Speicherverbrauch.
jein. Die läuft nicht so oft durch. Wenn Du verdoppelst, dann bist Du recht schnell an der Grenze des Abbruchs.
Wie oft kann man denn Deiner Meinung nach grob geschätzt verdoppeln? Welchen Var Typ nimmst Du denn? Schon mit integer kommst Du mit Fingern und Zehen durch beim Nachzählen oder? Doch das soll der Computer rechnen. ;-)
Beim Big Integer theoretisch unendlich oft.
Generell gilt aber rekursive Funktionen so sparsam wie möglich zu verwenden. Sie sind langsamer als normale Schleifen zumindest einfache und brauchen mehr Speicher.
Hey,
das hier ist zwar Java Code, aber dieser ist C# ja recht ähnlich:
private static void multiplyItself(int i) {
System.out.println(i);
multiplyItself(i*2);
}
Mfg Jannick (L1nd)
Diese Aufgabe bitte nicht rekursiv lösen. Hier ist eine explizite Schleife genau so gut zu schreiben und die verbraucht zudem weniger Speicher.
Außerdem führt deine Antwort zu einem Stackoverflow da es keine Abbruchbedingung gibt.
Möglichkeit A:
uint n = 1;
while(n <= 0x7ffffffe){
System.Console.WriteLine(n);
n<<=1;
}
Möglichkeit B:
//Anmerkung: Verweis für System.Numerics notwendig
System.Numerics.BigInteger n = 1;
while(true){
System.Console.WriteLine(n);
n<<=1;
}
*Linksshift