Silnia - zadanie SPOJ, błąd NZEC

0

Witam,
Poniżej przedstawię zadanie ze SPOJ i mój kod:
zadanie - http://pl.spoj.com/problems/FCTRL3/
kod:

    import java.util.Scanner;
    import java.lang.*;
     
    class Silnia {
     
    	int silnia(int x){
    		int wynik;
    		if(x==1) return 1;
    		wynik=silnia(x-1)*x;
    		return wynik;
    	}
    }
     
    class Main{
    	public static void main(String args[]){
    		int a;
    		Scanner wczyt = new Scanner(System.in);
    		a=wczyt.nextInt();
    		int liczba[]=new int[a];
    		for(int i=0;i<a;i++){
    			liczba[i]=wczyt.nextInt();
    		}
     
    		Silnia s = new Silnia();
     
    		for(int x:liczba){
    			System.out.println((s.silnia(x)/10)+" "+(s.silnia(x)%10));
    		}
     
     
    	}
    }

Kod działa gdy kompiluje go na pc jak i na Ideone, ale gdy wrzucam go na SPOJ'a to wyskakuje błąd NZEC. Gdyby ktoś mógł rzucić okiem i powiedzieć dlaczego wyskakuje taki błąd i w ogóle co on znaczy to będę bardzo wdzięczny.
Z góry dziękuję i pozdrawiam

2

Kod jest po prostu napisany źle. Wiesz jak duże liczby generuje silnia? Weź do ręki kartkę i sprawdź. 64 bitowy int przechowa nie wiecej niż 21! a ty tam masz zakres 1 000 000 000. Wiesz ile cyfr miałaby taka silnia? Nie miałbyś tyle miejsca na dysku twardym żeby zapisać taką liczbę ;) A ty sobie tak na pałe liczysz a potem próbujesz pobrać 2 ostatnie cyfry. Zalecam przy zadaniach ze SPOJa użyć myślenia a nie klepać "na pałe", bo to zwykle nie zadziała.

W tym przypadku zalecam zastanowić się co się stanie jak przejdziesz 10, tzn jak jednym z czynników silni będzie 10. Ile wyniesie ostatnia cyfra? A jeśli dodatkowo czynnikami będą też 2 oraz 5, czyli znów 10? Jaka jest ostatnia cyfra liczby 10x? A 100x?

0

wystarczy wejsc na wikipedie i tam jest taka bardzo ładnie rozpisana tabelka... polecam się jej wnikliwie przyjrzeć i wyciągnąć wnioski :)

0

Swoją drogą, jakbyś kiedyś w przyszłości potrzebował dwóch ostatnich cyfr czegoś, to znacznie lepiej jest brać coś % 100 niż tak jak u Ciebie, coś / 10coś % 10.

0

Dzięki Althorion, masz racje ;)
A co do Ciebie Khuzy to proponuje inne fora do nabijania postów ;)

0

Witam ponownie,
Zrozumiałem, że dla tego przykładu niepotrzebnie robię tyle obliczeń ponieważ zrozumiałem, że każda liczba większa od 9, daje dokładnie liczbę dziesiątek i jedności równą 0. Ale po wprowadzeniu wielu zmian wyskakuje ciągle błąd "Błędna odpowiedź".

import java.util.Scanner;
    class Main
    {
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		int a,d,j;
    		Scanner wczyt = new Scanner(System.in);
    		a=wczyt.nextInt();
    		int liczba[]=new int[a];
    		for(int i=0;i<a;i++){
    			liczba[i]=wczyt.nextInt();
    		}
 
    		for(int x:liczba){
    			switch(x){
    			case 1:
    				d=0;j=1;
    				break;
    			case 2:
    				d=0;j=2;
    				break;
    			case 3:
    				d=0;j=6;
    				break;
    			case 4:
    				d=2;j=4;
    				break;
    			case 5:
    				d=2;j=0;
    				break;
    			case 6:
    				d=2;j=0;
    				break;
    			case 7:
    				d=4;j=0;
    				break;
    			case 8:
    				d=2;j=0;
    				break;
    			case 9:
    				d=8;j=0;
    				break;
    			default:
    				d=j=0;
    			}
    			System.out.println(d+" "+j);
    		}
    	}
    }

Nawet po wklepaniu tego kodu, który wg mnie działa na 99%, ciągle wyskakuje ten sam błąd.
Jakieś pomysły? :)

1

Wypisujesz błędny wynik dla x=0.

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