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

SPOJ Ostatnia niezerowa cyfra silnii

Object Storage Arubacloud
0 głosów
1,814 wizyt
pytanie zadane 5 listopada 2017 w SPOJ przez michal12334 Obywatel (1,510 p.)
edycja 6 listopada 2017 przez michal12334

Zrobiłem zadanie z serwisu SPOJ ostatnia niezerowa funkcja silni. Wyskakuje mi przekroczono limit czasu i nie mam pomysłu jak zoptymalizować algorytm. Link do zadania:  http://pl.spoj.com/problems/OSTSIL/

 

#include <iostream>

using namespace std;

//funckja obliczajaca wartosc silni
unsigned long long obliczSilnia(int a) {
    if (a==1) return 1;
    else return a*obliczSilnia(a-1);
}

int main() {
    //zmienne oznaczajace liczbe testow oraz liczbe w danym tescie
    int t, liczba;

    //wczytanie wartosci liczby testow
    cin >> t;

    //petla ktora wykona wszystkie testy
    for (int i = 0; i<t; i++) {
        //wczytanie wartosci liczby dla danego testu
        cin >> liczba;

        //zmienna przechowujaca wartosc silni
        unsigned long long silnia = obliczSilnia(liczba);

        //obciecie zer stojacych z tylu liczby
        while (silnia/10*10==silnia) {
            silnia /= 10;
        }

        //wypisanie ostatniej niezerowej cyfry silni
        cout << silnia%10 << endl;
    }

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 5 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)
wypisz sobie wartosci silni od 1 do 10 i zauwaz regule.
komentarz 6 listopada 2017 przez michal12334 Obywatel (1,510 p.)
Mógłbyś dać mi jeszcze jedną wskazówkę bo nie widzę żadnej reguły?
komentarz 6 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)

liczba | silnia(liczba)

komentarz 6 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)
zuwaaz co sie dzieje z wartosciami silni gdy liczba jest wieksza lub rowna 10, a reszta to juz ify
komentarz 6 listopada 2017 przez michal12334 Obywatel (1,510 p.)
Chodzi o to, że ostatnia niezerowa cyfra w silni z np. 11 to ostatnia niezerowa cyfra z silni 1*8?
komentarz 6 listopada 2017 przez 10kw10 Pasjonat (22,880 p.)
pomylilem zadania ;d
komentarz 7 listopada 2017 przez michal12334 Obywatel (1,510 p.)

Ale pomogło mi to dojść do rozwiązania, choć teraz w kodzie mam błąd którego nie mogę znaleźć.

 

#include <iostream>

using namespace std;

//funckja obliczajaca wartosc silni
int obliczSilnia(int a, int k[]) {
    if (a==10) return k[8];
    else if (a<10) return k[a-1];
    else {
        for (int i = 0; i<9; i++) {
            k[i] = (k[i]*k[8])%10;
        }
        return obliczSilnia(a-10, k);
    }
}

int main() {
    //zmienne oznaczajace liczbe testow oraz liczbe w danym tescie
    int t, liczba;

    //wczytanie wartosci liczby testow
    cin >> t;

    //petla ktora wykona wszystkie testy
    for (int i = 0; i<t; i++) {
        //tablica przechowujaca koncowki silni od 1 do 9
        int koncowki[9] = {1, 2, 6, 4, 2, 2, 4, 2, 8};

        //wczytanie wartosci liczby dla danego testu
        cin >> liczba;

        //wypisanie ostatniej niezerowej cyfry silni
        cout << obliczSilnia(liczba, koncowki) << endl;
    }

    return 0;
}

 

komentarz 7 listopada 2017 przez michal12334 Obywatel (1,510 p.)
Widzę już, że ten kod nie może działać.
0 głosów
odpowiedź 5 listopada 2017 przez Schizohatter Nałogowiec (39,600 p.)
while (silnia/10*10==silnia)

czuję nieskończoną pętlę w powietrzu.
komentarz 5 listopada 2017 przez michal12334 Obywatel (1,510 p.)
silnia jest zmienna całkowitą, więc jeżeli silnia będzie równa 22 to 22/10 =  2    2*10 = 20

20 nie jest równe 22 więc pętla zostanie przerwana

Podobne pytania

0 głosów
0 odpowiedzi 248 wizyt
pytanie zadane 18 września 2022 w Inne języki przez Aragedens Obywatel (1,120 p.)
0 głosów
0 odpowiedzi 372 wizyt
pytanie zadane 30 września 2017 w JavaScript przez avrack4 Początkujący (370 p.)
0 głosów
1 odpowiedź 1,008 wizyt
pytanie zadane 17 lipca 2017 w SPOJ przez Jakub 0 Pasjonat (23,120 p.)

92,550 zapytań

141,392 odpowiedzi

319,519 komentarzy

61,935 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!

...