Przekroczono limit czasu. Jakiś pomysł?
#include <iostream> using namespace std; int silnia( int x) { int silnia = 1; for(int i=x;i>1;i--) { silnia = silnia*i; } return silnia; } int main() { int n; cin >> n; if( n < 1 ) return 0; int tab[n-1]; for(int i=0;i<n;i++) { cin >> tab[i]; } for(int z=0;z<n;z++) { int pierwsza(0), druga(0); if(silnia(tab[z]) < 10 ){ cout << "0 " << silnia(tab[z]) << endl;} if(silnia(tab[z]) == 24 ){ cout << "2 4" << endl;} if(silnia(tab[z]) > 24 ){ cout << silnia(tab[z]) / 10 << " 0" << endl;} } return 0; }
tak, bardzo prosty pomysł - poszukaj i przeczytaj dyskusję na temat tego zadania (jest kilka wątków, istotny jest ten najdłuższy)
czy przeczytałeś dyskusję związaną z tym zadaniem ?
i czy wiesz co robi zamieszczony przez ciebie kod, czy tylko wydaje ci się, że wiesz ?
Tak, czytałem, ale chciałem spróbować jeszcze tą metodą. I wiem: liczy silnie w pętli for, a jeżeli liczymy silnei dla liczby większej od 4 nie liczę 2 i 5, która jest w środku, żeby liczba była 10 mniejsza
jak myślisz, ile czasu potrzebuje procesor na wykonie miliarda (czyli 10 do 9 potęgi) mnożeń ?
i jak duża jest liczba 1000000000!, a jaką maksymalną wartość możemy zmieścić w typie unsiged long long ?
Skoro mam procesor 2GHz, więc jakoś 2 sekundy, a typ unsigned long long może zmieścić liczbę do 18'446'744'073'709'551'615, czyli nie może zmieścić silni z 1000000000
to jaki sens ma liczenie 1000000000! ?, skoro już wiesz, że nie wystarczy czasu oraz, że wynik nie będzie miał nic wspólnego z rzeczywistą wartością ?
No to muszę zmienić sposób w takim razie
Warto [trzeba] wiedzieć, że na systemach 32 bitowych unsigned long int != unsigned long long int, a jak tego nie wiesz, to załóż profilaktycznie, że spoj to 32 bitowiec.
sprawdź definicję silni, może być wiki
Dzięki, gotowe - zaliczone
to teraz usuń ten prawie dobry program - niech inni mają okazje samodzielnie pomyśleć