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

Object Storage Arubacloud
0 głosów
1,068 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,202 wizyt
+1 głos
2 odpowiedzi 532 wizyt
pytanie zadane 1 marca 2016 w C i C++ przez cherubinek Nowicjusz (190 p.)
0 głosów
5 odpowiedzi 2,003 wizyt
pytanie zadane 7 lutego 2016 w C i C++ przez XPACK Początkujący (320 p.)

92,631 zapytań

141,496 odpowiedzi

319,863 komentarzy

62,011 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...