C# Zahl immer weiter verdoppeln?

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.

Zahhak  14.10.2021, 18:29
Die Multiplikation mit 2 kannst du auch durch einen Rechtsschift lösen

*Linksshift

1
PeterKremsner  14.10.2021, 18:35
@Zahhak

Ich weiß. Keine Ahnung warum ichs mit sch geschrieben habe. Wohl unterbewusste eindeutschung

1

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.

Woher ich das weiß:Berufserfahrung – ich arbeite schon sehr lange im EDV Bereich, viele Sparten
PeterKremsner  14.10.2021, 18:23

Ich würde hier eine normale Schleife nutzen und keine Rekursive sonst erzeugt man nur unnötig hohen Speicherverbrauch.

2
Mauritan  14.10.2021, 19:04
@PeterKremsner

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. ;-)

0
PeterKremsner  14.10.2021, 21:37
@Mauritan

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.

0

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)

Woher ich das weiß:eigene Erfahrung
PeterKremsner  14.10.2021, 18:36

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.

3

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;
}
Woher ich das weiß:Hobby