Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ tablica liczb nieparzystych + przesunięcia.

Ins0maniaC 16 Lis 2014 18:23 720 9
  • #1 16 Lis 2014 18:23
    Ins0maniaC
    Poziom 17  

    Witam. Staram się zrobić program inicjujący 55 elementową tablicę z nieparzystymi liczbami losowymi z zakresu od -10 do 100 i przesuwający ją o 3 miejsca w dół. Jednak program zupełnie omija liczby parzyste, a i w przesunięciu cuda się dzieją. Ktoś podpowie, pomoże?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 9
  • Pomocny post
    #2 16 Lis 2014 18:29
    witoldwitoldowicz
    Poziom 28  

    Liczby nieparzyste są od -9 do 109 więc
    k=( (rand()%118) -9) |1;
    odrazu masz nieparzyste.

    0
  • Pomocny post
    #3 16 Lis 2014 18:31
    Dżyszla
    Poziom 42  

    Jeśli już chcesz sprawdzać parzystość liczby, to musisz to po prostu zrobić w pętli, której warunkiem wyjścia będzie nieparzysta liczba. Ty sprawdzasz raz i losujesz drugi raz i na tym koniec.
    A jeśli nie, to można po prostu zastosować ogólny wzór na liczbę nieparzystą jako 2x-1, dostosowując teraz do tego tylko zakres losowania (zmniejszony i połowę i przesunięty) - wówczas odpada potrzeba sprawdzania liczby, bo ze wzory wyjdzie zawsze nieparzysta.

    Co do przesunięcia - jak ono miało działać? Bo tu raczej jest coś zbliżonego do rolowania.

    @witoldwitoldowicz - a myślisz, że załapie operacje bitowe? Wg mnie takie rozwiązanie nie będzie czytelne i nie będzie umiał go obronić.

    0
  • #4 16 Lis 2014 18:34
    Ins0maniaC
    Poziom 17  

    Jeśli chodzi o o przesuwanie ma to działać na zasadzie, że liczba 4 ma być 1, liczba 5 ma być 2 itp. itd. + bufor, żeby nie zgubić 3 liczb.

    0
  • #6 16 Lis 2014 19:57
    Ins0maniaC
    Poziom 17  

    Już wszystko śmiga. Ewentualnie prosiłbym jeszcze @witoldwitoldowicz o wytłumaczenie tego |1. Jak to dokładnie działa? I jak tym sposobem wylosować na przykład same parzyste liczby?

    0
  • Pomocny post
    #7 16 Lis 2014 20:03
    witoldwitoldowicz
    Poziom 28  

    Bitowe OR czyli ustawi najmłodszy bit na 1 czyli będzie nieparzyste np.
    2 binarnie to 10
    3 binarnie to 11

    Dodano po 2 [minuty]:

    Ins0maniaC napisał:
    same parzyste liczby
    k=( (rand()%118) -9) &(~1);
    ~ oznacza negacje bitową.

    0
  • Pomocny post
    #8 16 Lis 2014 21:23
    Dżyszla
    Poziom 42  

    @Ins0maniaC - kolega pokazał sprytny wybieg i pewną charakterystyczną własność liczb parzystych i nieparzystych, którą można dostrzec w zapisie binarnym. Ja jednak, mimo wszystko, optowałbym jednak za rozwiązaniem czysto matematycznym w systemie dziesiętnym - czyli wylosowanie wyniku (oblicz, jaki zakres będzie potrzebny) i przemnożenie go przez dwa, a następnie odjęcie lub dodanie 1.

    0
  • Pomocny post
    #9 16 Lis 2014 21:58
    witoldwitoldowicz
    Poziom 28  

    Zgadzam się z kolegą Dżyszla. Należy pamiętać ze działa to tylko dla liczb całkowitych, a nie zmięnno przecinkowych np. float.

    0
  • #10 16 Lis 2014 23:51
    Ins0maniaC
    Poziom 17  

    Wszystko jasne. Dziękuję bardzo.

    0