suma poteg dwojki

0

suma potęg dwójki
Napisz program, który liczbę mniejszą od 256 zapisze jako sumę potęg liczby 2. Liczbę wprowadzamy z klawiatury. W programie zdefiniuj tablicę o wartościach: 128, 64, 32, 16, 8, 4, 2.

prosze o pomoc <33

2

Po treści to ten temat pasuje bardziej do drobnych ogłoszeń za $.

1

@ledi12: frytki do tego, juz mam

2

Prosisz o pomoc z czym konkretnie? Całość jest trywialna do zrobienia, możesz po prostu używać bitowego and (&) aby sprawdzić wartości poszczególnych bitów, które oznaczają, czy dana potęga 2 jest elementem sumy.

2

https://ideone.com/PAJR0U

#include <iostream>
using namespace std;

int main() {
	const int tablicaLength = 8;
	int tablica[tablicaLength] = {128, 64, 32, 16, 8, 4, 2, 1};
	
	int LiczbaMniejszaOd256;
	cin >> LiczbaMniejszaOd256;
	
	cout << LiczbaMniejszaOd256 << " = ";
	
	for (int i = 0; i < tablicaLength; i++)
	{
		if (LiczbaMniejszaOd256 / tablica[i] > 0)
		{
			LiczbaMniejszaOd256 -= tablica[i];
			cout << tablica[i];
			
			if (LiczbaMniejszaOd256 > 0) 
			{
				cout << " + ";
			}
		}
	}
	
	return 0;
}

Teraz skoro ja napisałem, poczekaj aż @_13th_Dragon napisze ulepszoną wersję :)


Jeszcze rozwiązanie według sugestii @kq
https://ideone.com/QJb63I

#include <iostream>
using namespace std;

int main() {
	const int tablicaLength = 8;
	int tablica[tablicaLength] = {128, 64, 32, 16, 8, 4, 2, 1};
	
	int LiczbaMniejszaOd256;
	cin >> LiczbaMniejszaOd256;
	
	cout << LiczbaMniejszaOd256 << " to suma liczb: ";
	
	for (int i = 0; i < tablicaLength; i++)
	{
		if ((LiczbaMniejszaOd256 & tablica[i]) > 0)
		{
			cout << tablica[i] << " ";
		}
	}
	
	
	return 0;
}
1

#include <stdio.h>

int main() {
	int x;
	printf("Podaj liczbe: ");
	scanf("%d", &x); 
	for (int i = 128; i >= 1; i = i >> 1) { 
		printf((x & i) > 0? "1" : "0");
	}
}

Tylko to jest bez sprawdzania błędów (w przypadku gdyby użytkownik wpisał jakieś głupoty).

	for (int i = 128; i >= 1; i = i >> 1) { 
		printf((x & i) > 0? "1" : "0");
	}

Tutaj iteruję w dziwny sposób, bo zmienna i przyjmie wartości 128, 64, 32, 16, 8, 4, 2, 1 (ponieważ zamiast ++ czy --, to dokonuję przesunięcia bitowego po każdej iteracji: i = i >> 1).

A potem sprawdzam za pomocą operacji bitowej AND, czy jest zapalony dany bit: (x & i) > 0 (ponieważ potęgi dwójki 128, 64, 32, 16... można potraktować jako maski bitowe, w których świeci się tylko jeden bit będący daną potęgą dwójki), jeśli jest zapalony, to wyświetlam stringa "1", jeśli zgaszony, to wyświetlam stringa "0".

2
Spine napisał(a):

Teraz skoro ja napisałem, poczekaj aż @_13th_Dragon napisze ulepszoną wersję :)

A proszę:

#include <iostream>
using namespace std;

int main()
{
	int value;
	cin>>value;
	for(int mask=128;mask;mask>>=1) if(value&mask) cout<<mask<<" ";
	return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.