Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Lekcja 30] Problem z lotkiem

Ostatnio zmodyfikowano 2012-11-29 20:46
Autor Wiadomość
mzmzmz
Temat założony przez niniejszego użytkownika
[Lekcja 30] Problem z lotkiem
» 2012-11-27 21:33:03
Witam!

Chciałbym prosić o pomoc w rozwiązaniu problemu z ostatnim zadaniem z lekcji 30 czyli z losowaniem 6 liczb ze zbioru <1,49>. Mianowicie nie wiem jak zrobić, żeby przy pomocy samych zagnieżdżonych pętli odrzucić z wyniku sekwencje tych samych liczb(żeby wszystkie permutacje zbiorów np.[1,2,3,4,5,6] zostały policzone jako jedna).

Przy pomocy rachunku prawdopodobieństwa to jest proste. Tych permutacji jest 6! i wystarczy wynik podzielić, ale jak bez tego to zrobić... Oto mój kod:
C/C++
#include <iostream>

using namespace std;

int main()
{
    long long lp = 0;
   
    for( int z1 = 1; z1 <= 49; z1++ )
    {
        for( int z2 = 1; z2 <= 49; z2++ )
        {
            if( z2 == z1 )
                 continue;
           
            for( int z3 = 1; z3 <= 49; z3++ )
            {
                if( z3 == z1 || z3 == z2 )
                     continue;
               
                for( int z4 = 1; z4 <= 49; z4++ )
                {
                    if( z4 == z1 || z4 == z2 || z4 == z3 )
                         continue;
                   
                    for( int z5 = 1; z5 <= 49; z5++ )
                    {
                        if( z5 == z1 || z5 == z2 || z5 == z3 || z5 == z4 )
                             continue;
                       
                        for( int z6 = 1; z6 <= 49; z6++ )
                        {
                            if( z6 == z1 || z6 == z2 || z6 == z3 || z6 == z4 || z6 == z5 )
                                 continue;
                           
                            lp++;
                        }
                    }
                }
            }
        }
    }
    cout << "Liczba mozliwych kombinacji wyniosla " << lp << endl; // wychodzi 10,068,347,520
    system( "pause" );
    return 0;
}
P-70019
CodeMeister
» 2012-11-29 19:58:27
Łoooo kurde... ale kod :D

Nie no, jeśli post jest już 2 dni bez odpowiedzi to chyba nikomu się tego kodu nie chce czytać, nie można go uprościć?
P-70110
Admixior
» 2012-11-29 20:18:29
hmm... pierwsze to trzeba usunąć if z continue;
drugie:
żeby obliczyć nie permutacje ale liczbę kombinacji zakładając że możemy używać tych samych liczb to taki jest wzór:
49*49*49*49*49*49 więc 6 pętli i po 49 w każdym.
A żeby obliczyć permutacje to musisz 49*48*47*46*45*44
dlatego że w każdym kolejnym kroku masz o jedną liczbę mniej niż wcześniej (bo zostały one wcześniej użyte), czy to była liczba 5 czy 10 to mało ważne bo ty masz tylko zliczyć, więc (tak mi się wydaje) że wystarczy po prostu w każdej kolejnej pętli odejmować po jednym od 49.


//down:
racja. żeby policzyć liczbę kombinacji trzeba zastosować silnie 1*2*3*4*...*47*48   //(49-1)!
z tym że wtedy nie będzie na pętli zagnieżdżonej :( więc musiał byś zrobić 48 zagnieżdżonych pętli i zliczać (każda pętla kończyła by się o jeden więcej niż poprzednia). Lub zrobić jedną pętlę liczącą krok - "i",  i drugą dodającą jeden dopóki "x<i" ;]
Mam nadzieję że za bardzo nie podpowiedziałem;]
P-70114
Mrovqa
» 2012-11-29 20:46:57
@Admixior pomyliłeś permutacje z kombinacjami.
1 2
2 1
To dwie różne permutacje, ale te same kombinacje.

/edit:
żeby policzyć liczbę kombinacji trzeba zastosować silnie 1*2*3*4*...*47*48   //(49-1)!
Eh... Liczbę kombinacji liczby się inaczej. Słyszałeś o czymś takim, co zwie się symbolem newtona? (n k)=n!/(k!*(n-k)!) - oznacza liczbę kombinacji. Poza tym - jak pisze w treści zadania - losujemy 6 liczb.
P-70119
« 1 »
  Strona 1 z 1