[C++] Program wyświetlający potęgi dwójki w podanej liczbie


(Maciej Rutkowski) #1

Cześć! Próbuję napisać program wyświetlający najwyższą potęgę dwójki z których składa się wpisana przez użytkownika liczba np. gdy użytkownik wpisze 256 to najwyższa potęga to 256, gdy poda 230 program wypisze 256+4, gdy użytkownik poda 112 program wypisze 64+32+16. Napisałem program w Python który działa ale nie mogę sobie poradzić żeby napisać taki program w C++. Oto treść programu w Python :

 

def wprowadzisprawdz(tekst): # deklaracja funkcji

    x = int(input(tekst)) # wprowadzanie zmiennej 

    if  x <= 0: 

        print ("Zmienna jest za mala")

        wprowadzisprawdz()

    return (x)

 

 

print ("Witam")

x = wprowadzisprawdz("Wprowadz liczbe: ")

 

tab = [] # deklaracja tablicy 

while x > 0:

    a = x%2 

    if a > 0:

        tab.append(1) # dodawanie do tablicy 1 

    else:

        tab.append(0)

    x = x//2 # dzielenie z "//" zawsze daje int nie float

x = len(tab) #zwraca dlugosc tablicy 

p = []

for i in range (0,x): 

    w = tab

    w = w * 2**i

    if w > 0:

        p.append(w)

p.reverse() # odwracanie tablicy 

print ("potegi \"2\" to: ",p) 


(Drobok) #2

Lepiej powiedz, że skopiowałeś program w python i go nie rozumiesz.

Pokaż co napisałeś w c++, oraz z czym masz problem / czego nie rozumiesz.

 

Zacznij od tego, że w treści twojego zdania słowo najwyższą jest zbędne. A analogiczny wynik dostaniesz z polecenia:

Czyli zamień liczbę na notację binarną, po czym wypisz potęgę dwójki danego indeksu gdy jego wartość = 1


(Rolek0) #3

Polecam:


(Maciej Rutkowski) #4

Jak narazie mam napisaną zamianę liczby na system binarny i wyświetlenie ile jedynek jest w liczbie binarnej co pozwoli mi na dowiedzenie się ile będzie potęg. Nie mam pomysłu jak napisać żeby wyliczało potęgi.

 

#include <iostream>

#include <string>

using namespace std;

int main()

{

    int jedynki=0;

    int liczba_dziesietna;

    cout<<"Podaj liczbę dziesiętną: ";

    cin>>liczba_dziesietna;

    string binarna = “”;

    do {

        if (liczba_dziesietna%2) {

            binarna = “1” + binarna;

            ++jedynki;

        } else binarna = “0” + binarna;

    } while ((liczba_dziesietna >>= 1)!=0);

    cout<<"Liczba binarna: "<<binarna<<endl;

    cout<<"Ilość jedynek: "<<jedynki<<endl;

    

    

    

    system(“pause”);

    return 0;

}


(kostek135) #5

Jeśli masz liczbę zapisana np: 10001001

v= 10001001 // (137)
i= 76543210

Gdzie i to indeks kolejny licząc od zera, na najmniej znaczącej pozycji. To swój wynik uzyskasz w następujący sposób: Wypisujesz tylko te pozycje dla których v = 1 oraz wartość dla pozycji i wynosi 2^i.


(nintyfan) #6

W C nie konkatenuje się stringów, jak w Python czy PHP. Poza tym, to nie rozumiem twojego algorytmu. Co do potęgi, to robisz to samo, co w Pythonie - sprawdzasz czy liczba jest podzielna przez dwa i dzielisz przez dwa. W assemblerze pod x86 i wcześniejsze chyba Intela również, dałoby się to zrobić szybciej - przesunięcie i sprawdzenie bitu przepełnienia/przeniesienia.


(tomms) #7

W C++ też się da:

 

#include <iostream>
#include <limits>
#include <cstdlib>

int main(int argv, char ** argc)
{
	if( argv != 2 )
	{
		std::cout << "syntax: swinka 1234" << std::endl;
		return 1;
	}

	unsigned long val = strtol(argc[1], 0, 10);
	unsigned long mask = std::numeric_limits<long>::max() + 1;
	int exp = sizeof(unsigned long) * 8 - 1;
	bool printed = false;

	while( mask != 0 )
	{
		if( (val & mask) != 0 )
		{
			if( printed )
				std::cout << " + ";

			std::cout << 2 << "^" << exp;
			printed = true;
		}

		mask >>= 1;
		exp -= 1;
	}

	std::cout << " = " << val << std::endl;

return 0;
}

$ clang++ -o swinka swinka.cpp
$ ./swinka 1
2^0 = 1
$ ./swinka 100
2^6 + 2^5 + 2^2 = 100
$ ./swinka 65342354
2^25 + 2^24 + 2^23 + 2^22 + 2^21 + 2^18 + 2^16 + 2^11 + 2^9 + 2^8 + 2^7 + 2^4 + 2^1 = 65342354

(nintyfan) #8

Pytanie czy chodzi o klasę String(lub o podobnej nazwie) czy po prostu o łańcuch znaków;-) .


(fufus) #9

Masz gotowca. Przeanalizuj sobie i się ciesz :stuck_out_tongue:


(enedil) #10

Twój kod jest fatalny pod kątem złożoności czasowej.

std::reverse(binarnia.begin(), binarnia.end());
    int powed = 1;
    for(int i = 0; i < binarnia.size() ; ++i) { //oblicza potegi
        if(binarnia[i]) {
            potegi.push_back(powed);
        }
        powed *= 2;
    }

(fufus) #11

Nie pisał, że ma być dobra złożoność. Chciałem zrobić mu przejrzysty kod krok po kroku :wink:

Typ nie ogarnia podstaw to i tak tam się dzieje dla niego aż za dużo


(Drobok) #12

Skoro gość nie ogarnia podstaw to dając mu gotowiec zwyczajnie go krzywdzisz. Pomijając fakt złych nawyków skoro ma działający kod to go sobie skopiuje do szkoły czy gdzie tam mu go zadali i nic się nie nauczy.

 

Pomijając fakt osób z trudniejszymi problemami które będą czekać na gotowce, a którym ty nie pomożesz :stuck_out_tongue: