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

Przekroczenie limitu czasu - silnia

Ostatnio zmodyfikowano 2012-11-17 18:15
Autor Wiadomość
Kentox
Temat założony przez niniejszego użytkownika
Przekroczenie limitu czasu - silnia
» 2012-11-17 17:37:35
Wysłałem na sprawdzaczkę internetową mój kod rozwiązujący zadanie dwie cyfry silni. Jednak program przekroczył limit czasowy (1 minuta).

Jak można zoptymalizować mój kod ???

     Treść zadania:

Niech n będzie nieujemną liczbą całkowitą. Liczbę n! (czytaj n-silnia) definiuje się następująco. Jeśli n ≤ 1, to n! = 1. Dla n > 1, n! jest równe iloczynowi wszystkich liczb od 1 do n, czyli n! = 1 * 2 * ... * n. Na przykład 4! = 1*2*3*4 = 24.

Zadanie
Napisz program, który:

    wczyta ze standardowego wejścia nieujemną liczbę całkowitą n,
    policzy cyfrę dziesiatek oraz cyfrę jedności w zapisie dziesiętnym liczby n!,
    wypisze wynik na standardowe wyjście.

Wejście
W pierwszej linii wejścia znajduje się jedna liczba całkowia D (1≤D≤30), oznaczjąca liczbę przypadków do rozważenia. Opis każdego przypadku składa się z jednej linii, w której znajduje się jedna nieujemna liczba całkowita n (0 ≤ n ≤ 1 000 000 000).

Wyjście
Dla każdego przypadku z wejścia. Twój program powinien wypisać w osobnej linii dokładnie dwie cyfry (oddzielone pojedynczą spacją): cyfrę dziesiątek i cyfrę jedności liczby n! zapisanej w systemie dziesiętnym.

Przykład
Dla danych wejściowych:

2
1
4

poprawną odpowiedzią jest:

0 1
2 4

   Mój kod:

C/C++
#include <iostream>

using namespace std;

int main() {
    int d;
    long long int a, silnia;
    cin >> d;
    for( int j = 0; j < d; j++ ) {
        cin >> a;
        silnia = 1;
        for( int i = 0; i < a; i++ ) {
            silnia =( silnia *( i + 1 ) ) % 100;
        }
        cout <<(( silnia % 100 ) / 10 )
        << silnia % 10 << endl;
    }
}
P-69411
ison
» 2012-11-17 17:43:31
Nie możesz iterować tyle razy. Hint: policz sobie kilkanaście kolejnych wartości silni i zobacz jakie powinny być dla nich odpowiedzi.
P-69412
wybraniec
Optymalizacja
» 2012-11-17 17:51:07
To że można rozwiązać ten problem szybciej to rozumiem, ale czemu Twoim zdaniem nie można iterować tyle razy (pomijając że 'i' musiałoby być long long)? Jest jakiś limit iteracji dla pętli for?
P-69413
anonim
» 2012-11-17 18:01:28
wszystkie silnie powyżej 9! kończą się dwoma zerami (bo mają dwie piątki i dwie dwójki w rozkładzie)
Policz sobie wartości n! dla n = 1 ... n = 9 i wypisuj je za pomocą if
np:
C/C++
cin >> n;
if( n == 1 or n == 0 )
     cout << 01;

else if( n == 2 )
     cout << 02;

else if( n == 3 )
cout << 06

...

     else if( n > 19
cout << 00;
P-69414
Kentox
Temat założony przez niniejszego użytkownika
Dzięki wszystkim !!!
» 2012-11-17 18:15:18
Dziękuję wszystkim za pomoc.

Mój ostateczny kod :

C/C++
#include <iostream>

using namespace std;

int main() {
    int d;
    long long int a, silnia;
    cin >> d;
    for( int j = 0; j < d; j++ ) {
        cin >> a;
        silnia = 1;
        if( a < 10 ) {
            for( int i = 1; i <= a; i++ ) {
                silnia = silnia * i;
            }
        } else {
            silnia = 0;
        }
        cout <<(( silnia % 100 ) / 10 ) << " " << silnia % 10 << endl;
    }
}
P-69416
Kentox
Temat założony przez niniejszego użytkownika
Dzięki wszystkim !!!
» 2012-11-17 18:15:35
Dziękuję wszystkim za pomoc.

Mój ostateczny kod :

C/C++
#include <iostream>

using namespace std;

int main() {
    int d;
    long long int a, silnia;
    cin >> d;
    for( int j = 0; j < d; j++ ) {
        cin >> a;
        silnia = 1;
        if( a < 10 ) {
            for( int i = 1; i <= a; i++ ) {
                silnia = silnia * i;
            }
        } else {
            silnia = 0;
        }
        cout <<(( silnia % 100 ) / 10 ) << " " << silnia % 10 << endl;
    }
}
P-69417
« 1 »
  Strona 1 z 1