• 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,064 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,140 wizyt
+1 głos
2 odpowiedzi 528 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez cherubinek Nowicjusz (190 p.)
0 głosów
5 odpowiedzi 1,904 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez XPACK Początkujący (320 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...