• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polski SPOJ zad 496 Dwie cyfry silni. Wynik (Przekroczono limit czasu )

Cloud VPS
0 głosów
1,260 wizyt
pytanie zadane 19 października 2016 w C i C++ przez Paq_93 Początkujący (260 p.)

Ktos wie jak mozna tu zaoszczedzic czasu ? :)

#include <iostream>

using namespace std;

int silnia(int n)
{
    int silnia=1;

    for(int i=2;i<=n;i++)
        silnia=silnia*i;

    return silnia;
}

int main()
{
  int ile,a;

  cin>>ile;

   for(int i=0;i<ile;i++)
   {
    cin>>a;
    cout<<silnia(a)/10<<" "<<silnia(a)%10<<endl;
   }
    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 19 października 2016 przez niezalogowany
wybrane 20 października 2016 przez Paq_93
 
Najlepsza
Wartości silni rosną bardzo szybko. Przykładowo 20! = 2432902008176640000 (takie liczby już dawno nie mieszczą się w zmiennej typu int). W zadaniu będą podawane przypadki gdy n będzie równe aż 1 000 000 000. Rozpisz sobie na kartce silnie od 1 do np. 12. Od 10! powinieneś zauważyć zależność, że ostatnie cyfry silni zawsze będą zerami więc liczenie ich nie ma sensu :) Zwłaszcza, że to pochłania dużo czasu, a wynik i tak wyjdzie poza zakres zmiennej.
komentarz 19 października 2016 przez niezalogowany
edycja 19 października 2016
Jeszcze jedna mała uwaga dla silnia(a) = 120
silnia(a)/10 = 12 - to liczba a chcą cyfrę

Proponuję zrobić (silnia(a)%100)/10 dla cyfry dziesiątek
komentarz 28 listopada 2016 przez Kertoip_123 Nowicjusz (120 p.)

Żeby nie tworzyć znów nowego tematu to pozwolę sobie dopisać tutaj. :P Mianowicie na spoju wyskakuje mi błędna odpowiedź i nie mam zielonego pojęcia dlaczego... Nie chciałby może ktoś mnie nakierować? ;>

 

#include <iostream>

using namespace std;

int main()
{
    int n, x, a=0, b=0;
    cin >> n;
    for(int i=1; i<=n; i++)
    {
        cin >> x;

        if(x<10)
        {
        	int s=1;
            for(int i=1; i<=x; i++)
                s=s*i;
                a=(s%100)/10;
            b=s%10;
            cout << a << " " << b;
        }
        else cout << a << " " << b;
    }

    return 0;
}

 

komentarz 28 listopada 2016 przez niezalogowany
edycja 30 sierpnia 2017

Dodałbym nową linię po cout. Gdy pętla działa sobie jakiś czas i wyjdzie np oblicz silnie z 10 to a i b mają już w sobie jakieś wartości. Powinieneś wtedy w elsie je wyzerować przed wypisaniem, albo napisać zera po prostu. Kod poprawny:

#include <iostream>

using namespace std;

int main()
{
    int n, x, a=0, b=0;
    cin >> n;
    for(int i=1; i<=n; i++)
    {
        cin >> x;

        if(x<10)
        {
            int s=1;
            for(int i=1; i<=x; i++)
                s=s*i;
                a=(s%100)/10;
            b=s%10;
            cout << a << " " << b<<endl;
        }
        else cout << a << " " << b<<endl;

        a=0; b=0;
    }

    return 0;
}

Albo bez zerowania zmiennych w pętli:

 else cout << 0 << " " << 0 << endl;
komentarz 28 listopada 2016 przez Kertoip_123 Nowicjusz (120 p.)
Zobaczyłem ten problem zaraz po napisaniu posta :P Ale i tak dziękuje, że się zainteresowałeś

Podobne pytania

0 głosów
1 odpowiedź 3,395 wizyt
+1 głos
2 odpowiedzi 644 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez cherubinek Nowicjusz (190 p.)
0 głosów
5 odpowiedzi 2,392 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez XPACK Początkujący (320 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...