12 / 12
Feb 2017

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ą ?

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.

to teraz usuń ten prawie dobry program - niech inni mają okazje samodzielnie pomyśleć :slight_smile: