• 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 )

VPS Starter Arubacloud
0 głosów
1,080 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,291 wizyt
+1 głos
2 odpowiedzi 551 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez cherubinek Nowicjusz (190 p.)
0 głosów
5 odpowiedzi 2,108 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez XPACK Początkujący (320 p.)

92,834 zapytań

141,778 odpowiedzi

320,826 komentarzy

62,164 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.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...