Od dłuższego czasu męczę się już z zadaniem na ostatnią cyfrę silnii. Opracowałem sobie algorytm, wygenerowałem testy(przy pomocy Pythona wyliczyłem silnię około 20 liczb i sprawdziłem ostatnie cyfry), wszystko się z nimi zgadzało... ale spoj ciągle podaje błędną odpowiedź.
Mój algorytm polega na tym, że po pierwsze podczas obliczania silnii przy każdym mnożeniu odrzucam wszystkie zera, następnie obliczoną liczbę zastępuje jej 3 ostatnimi cyframi - dzięki czemu nie wychodzę nigdy poza zakres inta a jednocześnie wciąż zgadza się ostatnia niezerowa cyfra... mimo to spoj nie chce przyjąć zadania.
To mój kod:
#include<iostream>
#inlcude<cstdio>
using namespace std;
int main()
{
int s=1;
int n;
int tab[10000];
scanf("%d", &n);
for(int j=0; j<n; j++)
{
s=1;
int l;
scanf("%d", &l);
for(int i=2; i<l+1; i++)
{
int p=i;
while(p%10==0)
{
p/=10;
}
s*=p;
while(s%10==0)
{
s/=10;
}
s=s%1000;
}
s=s%10;
tab[j]=s;
}
n--;
for(int i=0; i<n; i++)
{
printf("%d\n", tab[i]);
}
return 0;
}