dziesiętne na binarne, problem

0

Witam,
Napisałem program do zamiany liczby dziesiętnej na postać binarną. Oto on:

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

int main()
{
  int liczba, a=0, tab[a];
  cin >> liczba;
  for(liczba; liczba>=1; liczba=liczba/2)
  {
              if(liczba%2==0)
              {
              tab[a]=0;
              a++;
              }
              else
              {
              tab[a]=1;
              a++;
              }
              }
              
              for(int j=a-1; j>=0; j--)
              {
                      cout << tab[j];
                      if(j==0)
                      cout <<endl;
                      }
                      
    system("PAUSE");
    return EXIT_SUCCESS;
}

I teraz mam pytanie. Co jest w nim źle ? Zauważyłem, że liczby < 512 są poprawnie konwertowane na system binarny a przy większych od 512 program się zawiesza i zamyka. Używam Dev-C++.

0

To się w ogóle kompiluje? :O

int liczba, a=0, tab[a];

Gratuluję inicjowania tablicy na rozmiar 0 elementów :|
Wpisując cokolwiek do tej tablicy, nadpisujesz jakieś randomowe dane w aplikacji (może być to np.adres powrotu)...

Używam Dev-C++.

Porzuć to!
Wywal za okno, zapomnij o istnieniu i pobierz np.Code::Blocks...

4

Trochę kombinowania było, ale udało się bez dodatkowej pamięci :>

#include <stdio.h>

void print_bin(unsigned i) {
    for(unsigned a = 0, j = 2 << 30; j > 0; j >>= 1) {
        (a |= i & j) && putchar(!!(i & j) + '0');
    }
    putchar('\n');
}

int main() {
    print_bin(3);
    print_bin(8);
    print_bin(12);
    print_bin(1234);
    print_bin(941234);
}

Ktoś ma ciekawszy pomysł?

A wersja prostsza (i tak trochę przekombinowana) ale pierwsza rzecz jaka mi przyszła do głowy:

#include <string>
#include <iostream>
#include <cmath>
#include <algorithm>

std::string bin(unsigned num) {
    int len = (int)std::floor(std::pow(num, 0.5)) + 2; // ładny wzór na ilość znaków w liczbie binarnej
    char *data = new char[len+1];

    for(int i = len - 1; i >= 0; i--) {
        data[i] = (num & 1) + '0';
        num >>= 1;
        std::cout << i << std::endl;
    }

    data[len-1] = 0;
    return std::string(data);
}

int main() {
    std::cout << bin(7) << std::endl;
}
0
MSM napisał(a)

putchar((i & j) ? '1' : '0');

może

putchar(i & j & 1 + '0');
0

Prostszy, ale jest :

#include <iostream>
using namespace std;
void dwojkowo(int liczba);
int main()
{
    int i;
    cout<<"Dziesietnie : "; cin>>i;
    cout<<"Dwojkowo : ";
    dwojkowo(i);
    cout<<"\n\n";
}
void dwojkowo(int liczba)
{
    int reszta=liczba%2;
    if(liczba>1)
    {
        dwojkowo(liczba/2);
    }
    cout<<reszta;
}

jeśli chcecie tak

4

C++ way:

#include <iostream>
#include <climits>
#include <bitset>
 
int main() {
 
  std::cout << std::bitset<sizeof(int) * CHAR_BIT>(1234).to_string();
        
  return 0;
}

Pewnie strasznie wolne to jest. Można jeszcze trochę zmienić, żeby pomijało początkowe 0 (i wtedy rozmiar na stałe na 64 np).

Edit: o np. takie coś: :-D

template <typename T>
std::string slow_dec2bin(T value) {
  static_assert(std::is_integral<T>::value, "slow_dec2bin: T must be an integral type");
 
  const std::string result = std::bitset<sizeof(T) * CHAR_BIT>(value).to_string();
  return std::string(result, result.find_first_of('1'));
}
0

Dzięki wszystkim za odpowiedzi. Myślałem, że da się uzyskać taki rozmiar tablicy ile będzie łącznie zer i jedynek po zmianie z dziesiętnego na binarny. Ustawiłem rozmiar tablicy na 1000 i teraz wszystko jest dobrze. Patryk27, ściągnąłem Code::Blocks skoro go polecasz, zobaczę jak się w nim pisze. Można wiedzieć dlaczego uważasz, że Dev-C++ jest zły ?

1
Agrafa napisał(a):

Prostszy, ale jest :

#include <iostream>
using namespace std;
void dwojkowo(int liczba);
int main()
{
    int i;
    cout<<"Dziesietnie : "; cin>>i;
    cout<<"Dwojkowo : ";
    dwojkowo(i);
    cout<<"\n\n";
}
void dwojkowo(int liczba)
{
    int reszta=liczba%2;
    if(liczba>1)
    {
        dwojkowo(liczba/2);
    }
    cout<<reszta;
}

jeśli chcecie tak

Lepiej jest to napisać tak:

#include <iostream>
void d(int x){int r=x&1;if(x>1)d(x>>1);std::cout<<r;}int main(){int i;std::cin>>i;d(i);}

Kto da krótszą? ;)

1

@Patryk27 - Chyba trochę nie na temat..., może by tak przenieść dyskusję do innego działu?... Załóż temat w Off-Topic na przykład jeśli planujesz kombinować dalej.

Tym niemniej (pomijając main, nic w niej zabawnego nie ma):

#include <iostream>
void d(int x){int r=x&1;if(x>1)d(x>>1);std::cout<<r;} // Patryk27 (53) - 100.00% objętości kodu Patryka
void d(int x){!x||(d(x/2),std::cout<<x%2);}           // MSM      (43) -  81.13% objętości kodu Patryka
void d(int x){x&&(d(x/2),std::cout<<x%2);}            // MSM      (42) -  79.24% objętości kodu Patryka

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