Napisz program, który wczyta liczbę dziesiętną i wypisze liczbę cyfr potrzebną do zapisania tej liczby w systemie binarnym. Np. dla liczby 99 wypisze 7,ponieważ 99=1100011.

0

Meczę się już z tym zadaniem dobre kilka godzin. Jedyne co mi się udało zrobić to widać poniżej. Liczę na szybką odpowiedz i pozdrawiam.

#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
 
using namespace std;

int main() 
{
	int d;
	string b="";
	cout<<"Podaj liczbe dziesietna: "; cin>>d;
	while (d>0)
	{
		if (d%2==0) b='0'+b;
		else b='1'+b;
		d=d/2;	
	}
	cout<<"Liczba binarna: "<<b;
	{
	  ostringstream ss;
	  int b = b ;
	  ss << b;
	  string wynik = ss.str();
	  cout<<"     Wynik: "<<wynik.size();
 
    }
	return 0;
}
0

Tak na prawdę nie potrzebujesz całej konwersji, tylko musisz znaleźć na której pozycji jest pierwsza jedynka. Ja bym i tak w zadaniu do szkoły/uczelnie poszedłbym na skóty i użył std::bitset

const int num = 1024;
std::bitset<sizeof(num) * CHAR_BIT> bt(num);
size_t i = bt.size();
for(; i && !bt[i - 1]; --i);
        
std::cout << bt << " " << i;
3
several napisał(a):

Tak na prawdę nie potrzebujesz całej konwersji, tylko musisz znaleźć na której pozycji jest pierwsza jedynka. Ja bym i tak w zadaniu do szkoły/uczelnie poszedłbym na skóty i użył std::bitset

Alez to po prostu jest logarytm dwojkowy z danej liczby (zaokraglony w gore)
ceil(log2(input))

EDIT: po komentarzu kolegi nizej, floor(log2(input)) + 1 (??)

1

Alez to po prostu jest logarytm dwojkowy z danej liczby (zaokraglony w gore)

.....czasem plus jeden, np dla 512 czy 1024 ;)

4
#include <iostream>
#include <cmath>

int main()
{
    int x;
    while(std::cin >> x) {
        int exp;
        std::frexp(x, &exp);
        std::cout << x << ' ' << exp << '\n';
    }

    return 0;
}

https://godbolt.org/z/zq5zPcv6e

0

Zastanów się jak wygląda zapis binarny jakieś liczby, np
100101 = 2^5x1 + 2^4x0 + 2^3x0 + 2^2x1 + 2^1x1 + 2^0x1
jak sprawdzić przy przy której potędze liczby dwa będzie pierwsza znacząca jedynka? (pierwsza od lewej)
Możesz porównywać n-tą potęgę dwójki, do podanej liczby i zwiększać potęgę dwójki, dopóki jest ona mniejsza bądź równa od podanej liczby. Wtedy otrzymasz pierwszą potęgę dwójki większą od podanej liczby, która będzie twoim wynikiem. Zauważ, że gdybyś zaczynał od 1 i mnożył ją razy dwa, to tak jakbyś "przesuwał" w lewo znaczącą jedynkę.
1 <-1
10 <-2
100 <-4
1000 <-8

1

W komentarzu ##### insi napisał(a):
Albo zrobić to w jakiś prostszy sposób.

Chciałeś to masz:

#include <cmath>
#include <iostream>
using namespace std;
    
int main()
{
    for(unsigned x;cin>>x;cout<<x<<" "<<(x?(floor(log(x)/log(2))+1):1)<<endl) {}
    return 0;
}
5

można np. tak:

     int log2( int
 Il){            int lI=
'/'/             '/',ll=
             '-'-'-';
          do{lI     
        *='@'         
     /' ';ll     
   ++;}          while 
(lI<=Il);return(ll);}
0
#include <iostream>
using namespace std;

int bitcnt(int a) {
	int result = 0;
 
	while(a) {
		result++;
		a >>= 1;
	}	
 
	return result;
}

int main() {
	int a;
	while(cin >> a) {
		cout << bitcnt(a) << "\n";
	}
	return 0;
}

Przykład uruchomienia:
https://ideone.com/DwkeWY

1

@vpiotr: jakoś zera dla zera mi nie leży
a może by tak:

  if n < 256 return 8
  else.if n < 65536 return 16
  else return .... (32?)

i dalej co do niejednoznaczności w pytaniu
czy "dziesiętna" oznacza całkowitą, czy może naturalną, a może nawet rzeczywistą?
(choć nasze flouty i double bliższe wymiernym niż rzeczywistym)

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