Zliczanie cyfr w liczbie binarnej

0

mając algorytm rekurencyjny zamiany liczby na binarna, w jaki sposób mogę policzyć ilosc cyfr ? np:

  • wczytuje 20
  • wypisuje 10100
  • chciałbym aby wypisało 5

Proszę o pomoc

#include <iostream>
using namespace std;

void cyfry(int n)
{
    if (n!=0)
    {
        cyfry(n/2);
        cout<< n%2;
    }

}

int main()
{
    int n;
    cin>>n;
    cyfry(n);
    return 0;
}

1

Zamiast wyświetlać liczbę na ekranie, przechowaj ją w zmiennej łańcuchowej. Po konwersji będziesz mógł wyświetlić jej zawartość i za pomocą odpowiednich metod wyświetlić również długość tego ciągu, czyli liczbę zawartych w nim znaków.

Napisz sobie funkcję, która konwertuje liczbę z argumentu na binarną i zwraca ją z funkcji w postaci łańcucha. Rekurencja nie będzie tutaj przeszkadzać – wręcz przeciwnie.

0

napisałem cos takiego, mozna prosić o sprawdzenie i czy dobrze została napisana rekurencja??

#include <iostream>
using namespace std;

void cyfry(int n)
{
    string binarna;
    int k=0;
    while (n!=0)
    {
        if (n%2==0)
            binarna="0"+binarna;
        else
            binarna="1"+binarna;
        n/=2;
        k++;
    }
    cout<<binarna<<endl;
    cout<<k;

}

int main()
{
    int n;
    cin>>n;
    cyfry(n);
    return 0;
}


0

Napisz sobie funkcję zwracającą void, w pierwszym argumencie przekaż liczbę do konwersji, a w drugim przekaż docelowy ciąg znaków (przez referencję). Jeśli liczba jest różna od 0 to wywołaj tę funkcję rekurencyjnie, podając liczbę podzieloną na pół i drugi argument bez zmian, a następnie dodaj na koniec ciągu z drugiego argumentu znak obliczony na podstawie modulo z liczby.

Pseudokod:

void toBinary(int number, ref string value)
  if number != 0
    toBinary(number / 2, value)
    value += char(number % 2 + 48)
  end
end

Możesz też spróbować zwracać wszystko w rezultacie funkcji:

string toBinary(int number)
  if number != 0
    return toBinary(number / 2) + char(number % 2 + 48)
  else
    return ""
end

Pamiętaj – powyższe to pseudokod, a Twoim zadaniem jest implementacja w C++. ;)

0

Probuję zaimplementowac ten pseudokod

string toBinary(int number)
  if number != 0
    return toBinary(number / 2) + char(number % 2 + 48)
  else
    return ""
end

cieżko mi zrozumiec co tu jest napisane mozna prosic o jeszcze jakas wskazowke ? na razie mam tylko tyle :

string zamiana(int n)
{
    if(n!=0) return zamiana(n/2) + char(n%2+48);
    else return ;

}
0

Pogubiłeś się trochę… w sumie jest Ok, gdyby nie pusty return, gdy warunek nie jest spełniony.

Moja propozycja (działająca rzecz jasna):

string toBinary(int number)
{
  if(number != 0)
    return toBinary(number / 2) + char(number % 2 + 48);
  else
    return "";
}

Choć dobrze by było, gdyby zerknął na ten kod ktoś zaznajomiony z tym językiem.

0

i mój głowny problem nie wiem jak zliczyc ilość cyfr po zamianie na postać binarną

0

Takie rzeczy sprawdza się w dokumentacji… string.length().

0

dziękuje bardzo teraz wszystko działa jak nalezy :)
mam ostatnie pytanko co znaczy ten fragment kodu bo pierwszy raz spotykam sie z takim zapisem

char(number % 2 + 48)
0

Ta linijka służy do przerobienia liczby na znak. Wykonujemy modulo na liczbie – operacja zwraca liczbę 1 lub 0. Kody cyfr zaczynają się od 48, więc do tej reszty z dzielenia dodaje się właśnie 48. Jeśli modulo zwróci 0 to po dodaniu 48 wyjdzie 48 – to jest kod znaku 0. Jeśli zwróci 1 to po dodaniu 48 wyjdzie 49 – to jest kod znaku 1.

Teraz aby można było tę liczbę wykorzystać, należy ją zrzutować na znak – to właśnie robi char(), wynik liczbowy obliczeń znajdujących się pomiędzy nawiasami traktuje jako znak, który to dodawany jest do ciągu. Gdyby nie to rzutowanie to nie mógłbyś wyniku obliczeń dodać do ciągu – kompilator zgłosiłby niezgodność typów danych.

Istnieją dwa zapisy rzutowania jednego typu danych na drugi:

  • (char)(number % 2 + 48) – w stylu języka C,
  • char(number % 2 + 48) – notacja funkcyjna (funkcjonalna).

Ja przez przypadek użyłem drugiej, bo pomieszało mi się zapisem rzutowania z Pascala. Ale oba zapisy są prawidłowe, dlatego kod kompiluje się i działa prawidłowo. Po więcej informacji odsyłam do dokumentacji.

0

Dziękuję teraz wszystko jasne :)

2

Jeszcze dodam, że ilość cyfr w zapisie binarnym liczby n zapisanej w systemie dziesiętnym można obliczyć ze wzoru:
#digits = floor(log2(n)) + 1 // log2 - logarytm przy podstawie 2, floor - standart.

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