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

SPOJ DWIE CYFRY SILNI

0 głosów
784 wizyt
pytanie zadane 12 sierpnia 2019 w C i C++ przez wjacoszek2000 Początkujący (290 p.)

Witam, stworzyłem program zgodny z poleceniem: https://pl.spoj.com/problems/FCTRL3  Niestety sędzia nie zalicza mi zadania. Można stworzyć program wypisujący końcówki silni aż do 9 ale moim zdaniem program traci na elegancji. Czy mogę liczyć na jakąś pomoc wskazówkę lub podkreślenie gdzie jest błąd?

#include <iostream>


using namespace std;
int liczba, suma,t;
int ile,s;
int silnia(float l)
{
    if(l==0) return 1;
    else return l*silnia(l-1);

}

int main()
{  cin>>ile;
   for (int i=1; i<=ile; i++)
   {
       cin>>liczba;
       if (liczba>9)
       {
           cout<<"0 0";
       }
       if (liczba<=9)
        {
          suma=silnia(liczba);
          s=(suma/10)%10;
          t= suma%10;
          cout<<s<<t;
        }
   }

    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 12 sierpnia 2019 przez Kacper Sas Dyskutant (8,460 p.)
Sprawdź wynik np. 20! i porównaj z maksymalną wartością typu int, jaki zwraca funkcja "silnia". Można to zrobić elegancko w sposób jaki wymieniłeś.

// gdy rozwiązywałem to zadanie pierwszy raz nie pomyślałem o przepełnieniu i powtarzających się końcówkach, więc brnąłem w liczenie. Nie wiem jak, ale SPOJ zaliczył to zadanie z czasem 0.78, a potem 0.76 XD prawdopodobnie ucięło zmienną przy przepełnieniu pozostawiając końcówkę. Nie zastanawiałem się w sumie nigdy dlaczego. To tak w ramach lekkiego offtopu.
komentarz 15 sierpnia 2019 przez mycha Nowicjusz (140 p.)

Mam pytanie bo rozwiązałam to zadanie w taki sposób ale wciąż jest odpowiedź błędna na SPOJ.. Dlaczego?

public class NSilnia {
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int liczba;
		int ile;
		ile = sc.nextInt();
		for(int y=0; y<ile; y++) {
			
		
		liczba = sc.nextInt();
		
		switch (liczba) {
		case 1:
			System.out.println("0 1");
			break;
		case 2:
			System.out.println("0 2");
			break;
		case 3:
			System.out.println("0 6");
			break;
		case 4:
			System.out.println("2 4");
			break;
		case 5:
			System.out.println("2 0");
			break;
		case 6:
			System.out.println("2 0");
			break;
		case 7:
			System.out.println("4 0");
			break;
		case 8:
			System.out.println("2 0");
			break;
		case 9:
			System.out.println("8 0");
			break;
		case 10:
			System.out.println("0 0");
			break;
		case 11:
			System.out.println("0 0");
			break;
		case 12:
			System.out.println("0 0");
			break;
		case 13:
			System.out.println("0 0");
			break;
		case 14:
			System.out.println("0 0");
			break;
		case 15:
			System.out.println("0 0");
			break;
		case 16:
			System.out.println("0 0");
			break;
		case 17:
			System.out.println("0 0");
			break;
		case 18:
			System.out.println("0 0");
			break;
		case 19:
			System.out.println("0 0");
			break;
		case 20:
			System.out.println("0 0");
			break;
		case 21:
			System.out.println("0 0");
			break;
		case 22:
			System.out.println("0 0");
			break;
		case 23:
			System.out.println("0 0");
		case 24:
			System.out.println("0 0");
			break;
		case 25:
			System.out.println("0 0");
			break;
		case 26:
			System.out.println("0 0");
			break;
		case 27:
			System.out.println("0 0");
			break;
		case 28:
			System.out.println("0 0");
			break;
		case 29:
			System.out.println("0 0");
			break;
		case 30:
			System.out.println("0 0");
			break;
		}
		}
		}
	}

 

0 głosów
odpowiedź 12 sierpnia 2019 przez Szfierzak Gaduła (3,750 p.)

Kacper Sas tutaj jest warunek na silnię większą od 9, który eliminuje przepełnienie inta. Na pierwszy rzut oka nie dajesz znaku nowej linii w warunku kiedy liczba>9, więc wyniki zapisywane są ciągiem obok siebie - błędna odp. 

Dalej podobnie

cout<<s<<t;

brak spacji i nie dajesz znaku nowej linii - błędna odpowiedź.

komentarz 12 sierpnia 2019 przez wjacoszek2000 Początkujący (290 p.)
Niestety po wpisaniu endl nadal sędzia nie akceptuje zadania
komentarz 12 sierpnia 2019 przez Szfierzak Gaduła (3,750 p.)
Tak sędzia rozróżnia co jest wejściem/wyjściem, ale formatowanie wyjścia należy do Ciebie. Czyli jeżeli w zadanku masz, że każdy wynik musi być w nowej lini to musisz dodać albo endl albo "\n", plus pojedynczą spacje - zgodnie z treścią zadania - między liczbami dziesiątek i jedności.
komentarz 12 sierpnia 2019 przez wjacoszek2000 Początkujący (290 p.)

poprawiłem i nadal ten sam błąd indecision

   cout<<s <<" "<<t <<endl;

 

komentarz 12 sierpnia 2019 przez Szfierzak Gaduła (3,750 p.)
edycja 12 sierpnia 2019 przez Szfierzak

A tutaj też dodałeś??

cout << "0 0" << endl;

Wklejałem Twój kod do spoja z poprawkami i przechodzł.

1
komentarz 12 sierpnia 2019 przez wjacoszek2000 Początkujący (290 p.)

Działa, dziękuje bardzo na drugi raz będę zwracał większą uwagę na polecenie wink

Podobne pytania

0 głosów
1 odpowiedź 400 wizyt
pytanie zadane 25 września 2021 w C i C++ przez polandonion Dyskutant (7,710 p.)
0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 27 grudnia 2018 w C i C++ przez Przemek49 Obywatel (1,260 p.)
0 głosów
2 odpowiedzi 2,414 wizyt
pytanie zadane 12 sierpnia 2018 w C i C++ przez fafel Nowicjusz (140 p.)

93,754 zapytań

142,715 odpowiedzi

323,363 komentarzy

63,350 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...