Błąd wykonania (SIGFPE)

0

Witam, mam dziwny problem bo nie mogę doszukać się błędu "błąd wykonania ( SIGFPE) ", jeśli ktoś mógł by rzucić okiem.

#include <iostream>

using namespace std;

int sil ( int n )
    {
        if ( n==0 || n==1 ) return 1;
        if ( n>1 ) return sil(n-1)*n;
    }

int ostatnia ( int s )
    {
        int p=s%10;
        return p;
    }

int ostatnia_nie_zerowa ( int s, int k=1 )
    {
        int z=s/k;
        int p=z%10;
        if ( p!=0 ) return p;
        if ( p==0 ) return ostatnia_nie_zerowa(s,k*10);

    }

int ile ( int s )
    {
        int ile=0;
        for ( ; s>1 ; s/=10 ) {ile++;}
        return ile;
    }


int main()
{
    int t,silnia,w,n;
    cin >> t;
    while ( t-- )
    {
        cin >> n >> w;
        silnia=sil(n);
        if ( w==1 )
                {
                    cout <<  ostatnia(silnia) << "\n";
                }
         if (w==2)
                {
                    cout <<  ostatnia_nie_zerowa(silnia) << "\n";
                }
        if (w==3)
                {
                    cout <<  ile(silnia) << "\n";
                }

    }
    return 0;
}
 
0

Użyj debuggera.

0

http://ideone.com/96GUG jakby działa. Jakie liczby powodują błąd?

0

właśnie nie wiem, bo te liczby są losowane przez system, na spoju.... I nie mam zielonego pojęcia co by to mogło być, gdyż nie jestem zbyt obeznany w wykrywaniu błędów, zawsze miałem z tym problem.

0

Daj link do zadania.

0

Zauważ, że 1000! ma 2568 cyfr, czyli o wiele więcej niż może pomieścić int. Musisz to zrobić sprytniej.

0

racja, ale long long też tego nie uchwyci....

0

No tak, tablice.... Ale ciężko będzie to " ubrać " w kod... Rzucił byś jakimś hasełkiem-podpowiedziom?

0

Możesz też operować na tablicach znaków, ale tutaj jest trochę zabawy z tym, bo trzeba samemu napisać operacje arytmetyczne.

0

Coś czuje, że z moim poziomem to trochę potrwa ale cóż pozostaje tylko wziąć się w garść i to napisać ;D
Dzięki,

0

Wydaje mi się, że nie musisz wcale liczyć silni.

0

Chcesz powiedzieć, że chodzi Ci o zależność, że silnia powyżej jakiejś liczby ma zawsze zero na końcu? no to jeszcze da się zrobić gorzej z ostatnią nie zerową.

0

Tutaj znajdziesz rekurencyjny wzór na ostatnią niezerową cyfrę silni, tylko podejrzewam, że dla n>64*5 będziemy mieli przepełnienie zakresu przy potęgowaniu, prawda?

http://www.artofproblemsolving.com/Forum/viewtopic.php?p=577096&amp;ml=1#577096

U mnie powyżej n=309 pojawiają się zera jako wynik L(n), a kilka poniżej też jest błędne.

const int cyfry_silni[]={1,1,2,6,4};
unsigned long long int L(int n)
{
    int q=n/5;
    int r=n%5;
    if( q==0) return cyfry_silni[r];
    return ( (unsigned long long int)pow(2,q) * L(q) * cyfry_silni[r]) % 10;
}

Zapewne nie tędy droga, próbuj liczyć inaczej.

0

Co do ilości cyfr to poszukaj przybliżenia Stirlinga. Ogólnie to wygląda na zadanie z jakiegoś trwającego konkursu, na razie za dużo pomocy tutaj nie dostałeś, ale to i tak trochę nie uczciwe.

0

Ja to zrobiłem tak:

1 234 000 * 11 = 13 574 000
1 234 000 * 12 = 14 808 000
1 234 000 * 13 = 16 042 000
16 042 000 * 17 = 272 714 000
16 042 000 * 230 = 3 689 660 000

Widzisz tę zależność między ostatnimi niezerowymi cyframi czynników iloczynu, a ostatnią niezerową cyfrą wyniku iloczynu?
Jest on równy reszcie z dzielenia przez 10 iloczynu tych dwóch ostatnich niezerowych cyfr czynników iloczynu.
np: 1 234 000 * 13</code> = 16 04<code>2 000 , czyli 4*3=12;12 mod 10 =2.

Uwaga na wyjątki pojawiające się w wypadku, gdy ostatnią niezerową cyfrą czynniku iloczynu jest 5!

1 użytkowników online, w tym zalogowanych: 0, gości: 1