Kolejne potęgi liczby 2

0

Treść zadania wygląda następująco:
Napisać program, który wczytuje od użytkownika liczbę całkowitą dodatnią n, a następnie wyświetla na ekranie wszystkie potęgi liczby 2 nie większe, niż podana liczba. Przykładowo, dla liczby 71 program powinien wyświetlić:
1
2
4
8
16
32
64

Sprawa wygląda tak, iż cały kod mam gotowy, prezentujący się w ten sposób:

int n = 1;
int liczba;
{
    Console.Write("Wprowadź liczbę: ");
    liczba = Convert.ToInt32(Console.ReadLine());
    while (n * 2 <= liczba)
    {
        n = n * 2;
        Console.WriteLine(n);
    }
}

ale chciałbym to przekształcić w wersję windows forms, po zrobieniu wszystkiego, przy podpinaniu funkcji pod przycisk, wyświetlał mi się tylko ostatni wynik, czyli przy podaniu liczby 71 wyświetlało się 64 i później cały program poszedł w rozsypkę, czy ktoś wie, jak ten kod może zamienić na windows forms, tak by wyświetlało w jednej lini, niezależnie od kontrolki, kilka wyników w jednej wiadomości, nie kwestia wykonania zadania a spojrzenia okiem na wersję prawidłową i poprawienie swoich błędów, bo od miesiąca zacząłem praktykować C# i właśnie tak wygląda sprawa :D

3
bombawleb napisał(a):

czy ktoś wie, jak ten kod może zamienić na windows forms, tak by wyświetlało w jednej lini, niezależnie od kontrolki, kilka wyników w jednej wiadomości

Jakoś tak by to było:

string wynik = "";
while (n * 2 <= liczba)
{
  n = n * 2;
  wynik += n.ToString() + ", ";
}
Console.WriteLine(wynik); // w formsach sobie to zamienisz na wysłanie wyniku do kontrolki

wynik sobie przekazujesz do jakiejś kontrolki.
Oczywiście można to dopracować, żeby na końcu stringa nie było przecinka, no i żeby nie budować stringa w tak nieoptymalny sposób.


Jeśli byś chciał ulepszyć implementację Twojego rozwiązania, to zamiast n = n * 2; możesz użyć przesunięcia bitowego: n = n << 1;.

2

wg mnie tak bardziej sensownie:

StringBuilder sb=new StringBuilder();
for(int n=1;n<=liczba;n<<=1) sb.append(i>1?", ":"").append(n);
Console.WriteLine(sb.ToString());
5

@_13th_Dragon: Zabawa w kto da bardziej nieczytelną odpowiedź?

Console.WriteLine(string.Join(", ", Enumerable.Range(0, liczba).Select(b => (ulong)1 << b)));
0

A cos takiego nie starczy?

	for(int i = 1;i<=71; i*=2) {
  	   Console.WriteLine(i);
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1