[C++] Zawieszanie się prostego programu.
Witajcie,
Tydzień temu zacząłem uczyć się C++ (wybaczcie więc toporność niektórych rozwiązań) i przechodzę właśnie okres niepohamowanej, szczęśliwej, chaotycznej i bezcelowej twórczości. Z większością problemów, które napotykam jakoś daję sobie radę sam, teraz jednak natrafiłem na mur.
Oglądając filmik (http://www.youtube.com/watch?v=ZWib5olGbQ0&list=UUoxcjq-8xIDTYp3uz647V5A) przedstawiający rozwiązywanie niebanalnego problemu matematycznego, nad którym potężne umysły głowiły się przez wieki, w przypływie neofickiej fantazji postanowiłem sprawdzić, czy będę potrafił zrobić program sprawdzający statystycznie prawdziwość matematycznego rozwiązania problemu przedstawionego w filmie.
Program ma więc za zadanie:
- wygenerować x (int proby) losowych szeregów liczb od 1 do n.
- na każdym z szeregów pominąć y (int proc) pierwszych wyników z szeregu
- wybrać najbliższy kolejny wynik, który (jeżeli to możliwe) będzie wyższy niż jakikolwiek z tych pominiętych
- zebrać statystyki z ilości wybranych w ten sposób wartości minimalnych, maksymalnych oraz średnią
Wszystko w programie działa dobrze, ale tylko na małych liczbach (tak przynajmniej wynika z moich testów), po wprowadzeniu większych zmiennych np. przy x=100, n=100 program zawiesza się; przy x=10, n=1000 pokazuje error i zamyka się.
Nie wydaje mi się, by przeliczenia były na tyle skomplikowane by procesor nie dawał sobie z tym rady, przecież to mikroskopijne wyliczenia!
Czy macie jakiś pomysł co może być nie tak w moim kodzie?
#include <iostream>
#include <time.h>
#include <windows.h>
using namespace std;
int n, proby, proc, _max = 0, _min = 0;
float srednia = 0;
int main()
{
srand( time( NULL ) );
cout << endl;
cout << "Dla ilu obiektow sprawdzic teze: ";
cin >> n;
cout << endl;
cout << "Podaj ile razy sprawdzac: ";
cin >> proby;
cout << endl;
cout << "Ile procent pierwszych wynikow pominac: ";
cin >> proc;
cout << endl;
int toy[ n ];
for( int y = 0; y < proby; y++ )
{
int i = 0, x;
while( i < n )
{
int ii = 0;
x = rand() % n + 1;
while( ii <= i )
{
if( x != toy[ ii ] ) ii++;
else x = rand() % n + 1, ii = 0;
}
toy[ i ] = x;
i++;
}
proc = n * proc / 100;
if( proc < 1 ) proc = 1;
int j = 0, k = proc;
while(( j < k ) and( proc + 1 < n ) )
{
if( toy[ proc ] < toy[ j ] ) proc++, j = 0;
else j++;
}
if( toy[ proc ] == 1 ) _min++;
if( toy[ proc ] == n ) _max++;
srednia += toy[ proc ];
}
cout << "Najnizsza wartosc wybrano " << _min << " razy" << endl;
cout << "Najwyzsza wartosc wybrano " << _max << " razy" << endl;
cout << "Sredni wybor to " << srednia / proby << endl;
return 0;
}
W większości miejsc używam liczba całkowitych - nie zależy mi na dokładności, raczej na ćwiczeniu.