Liczenie całej wartości silni nawet rekurencją nie ma żadnego sensu a potem jeszcze dzielenie, Takich liczb w jak są w testach to po wyliczeniu silni nie pomieści żaden wbudowany typ danych. To zadanie trzeba rozwiązać na warunkach zerknij sobie na wartości silni https://pl.wikipedia.org/wiki/Silnia749
i spróbuj coś zauważyć aż się prosi o użycie warunków .
Hej!
Mógłby mi ktoś pomóc? Jestem początkujący. Mianowicie mam problem z wypisaniem tych dwóch ostatnich cyfr silni... Nie wiem jak wypisać je od tyłu (moze w tabeli?)
To jest mój kod:
#include <iostream>
using namespace std;
long long int silnia (long long int n)
{
long long int wynik=1;
int i;
for (i=1; i<=n; i++)
{
wynik=wynik*i;
}
return wynik;
}
void ostatnie2 (long long int o)
{
long long int wynik=1;
int i, b;
for (i=1; i<=o; i++)
{
wynik=wynik*i;
}
if (o<4)
{
cout<<"0"<<" "<<wynik<<endl;
}
else
{
while (wynik>0)
{
b=wynik;
b=b%10;
wynik=wynik/10;
}
cout<<b<<" "<<wynik<<endl;
}
}
int main()
{
int ile, ile_cyfr, b, i, wyn;
long long int n;
cout<<"Ile obrotow petli: ";
cin>>ile;
while (ile<=0)
{
cin>>ile;
}
for (i=0; i<ile; i++)
{
cout<<"Podaj n silnie: ";
cin>>n;
while (n<=0)
{
cin>>n;
}
cout<<endl;
wyn=silnia(n);
cout<<"Silnia wynosi: "<<wyn;
cout<<endl;
cout<<"2 ostatnie to: ";
ostatnie2(n);
}
return 0;
}
Po pierwsze kody sprawdza automat, nie wypisuj niczego czego nie ma w opisie wyjścia (bo zostanie to uznane za błędną odpowiedź) .
Po drugie przeczytaj ten temat, jest tu napisane jak zrobić to zadanie poprawnie. W ten sposób raczej ci się nie uda. A ostanie cyfry jak byś gdzie indziej potrzebował to przez resztę z dzielenia (zwykle zapisuje się ją w kodzie jako %). W tym przypadku było by to coś takiego:
ostatnia = liczba % 10
przedostatnia = ((liczba - ostatnia) / 10) % 10
Nie testowałem wiec mogą być drobne błędy.
Ale warto, aby wyskajiwało z umiarem, a nie tak bez składu i ładu, jedne za drugim, To co wyskakuje powinno zachować jakiś minimalny odstęp, każdy wyskakujący od każdego innego wyskoczka, to będzie jeszcze ładniej... [a dokładniej każdych dwóch od innych dwóch[. A jeszcze dokładniej, aby wszyscy inni nie pchali się od razu na tych dwu pierwszych.
PS
Bardzo ciekawe historyjki znajdziesz np tu: http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=1&t=1214&sid=d2eda26d0adacdeab4e8df238ac21e6e135
@anim_90 napisał:
Ja napiszę, że nie tylko niepotrzebny ale właśnie on i parę linijek niżej drugie takie sprawdzanie są nie tylko niepotrzebne ale i bezsensowne, bo właśnie one wprowadzają błąd. Poczytaj sobie dokładnie zakresy w zadaniu i albo popraw te zakresy u siebie w programie albo wyrzuć całkiem te sprawdzania. Jak znajdę, to zaraz doklęję tu link z ciekawostkami. Okazuje się, że ten link podałem już w tym wątku trochę wyżej:
Hej! Poprawiłem kod, ale sedzia nie akceptuje (przekroczono limit czasu....)
Co jest nie tak? Może mi ktoś uświadomić?
Ręce opadają. Nie, nie dlatego, że masz błedny kod, to normalne, ale dlatego, że wiesz, że coś jest nie tak z twoim kodem [tak twierdzi sędzia] a Tobie nie chce się nawet przejrzeć wątku i poszukać rozwiązania [nie tobie pierwszemu] Może to po prostu wygodnictwo? Po co mam szukać samemu, jak może mi znaleźć błąd ktoś inny [z forum?]
Poniżej masz swój kod z błędnymi odpowiedziami na niektóre testy.
https://ideone.com/mVnDtk164
Jestem dopiero początkującym i uwierz mi czytałem ten wątek i inne. Dzięki za tamte wyniki - poprawiłem zmienną long long int na long long unsigned int ale dalej mi nie przeszło. W dalszym ciągu nie wiem co jest nie tak...
https://ideone.com/etD2w546 - a tu mój poprawiony kod
Uwierz mi, wierzę Ci, ale na temat tego zadania jest nie tylko ten jeden wątek, są/jest także na starym forum. Typy zmiennych nie są z gumy i nie rozciągają się w nieskończoność jak guma w majtkach [a nie ona też nie w nieskończoność], więc zmaina na unsigned nic tu nie pomoże. Dokładne wartości silni i wiele innych ciekawych rzeczy możesz się dowiedzieć - sprawdzić np tu: http://www.wolframalpha.com/input/?i=2158! Jeśli wpiszesz w okienko inną wartość np 33!, to Wolfram obliczy silnię 33. Możesz, też napisać sobie taki jak poniżej lub podobny program i się nim pobawić i porównać wyniki z Wolframem.
int main(){
long long wynik = 1; //możesz potem dodać unsigned
int n = 1000000000;
string c;
cout << "Nie przeszkadzać! Ja tu usiłuję policzyć silnie dla n = 1000000000! ;-)\
\n=======================================================================\n";
cout << wynik << endl;
for (int i = 1; i < n; ++i){
cout << " x " << i << endl;
wynik *= i;
cout << "=" << wynik << " Czy ok? wciśnij Enter lub ctr c";
getline(cin, c);
}
}
U mnie pod linuxem w/w program działa znakomicie. Spróbuj dojechać nim chociaż do 66 a lepiej do 100.
Powodzenia
PS
Gdy bawiąc się moim programikiem, jeżeli u Ciebie zadziała i jeżeli będziesz "jechał" nim powoli, to może uda Ci się zaobserwować ciekawy efekt, tzw "zerwania gumy w majtkach", czyli jakiś tam overflow, czyli przekroczenie zakresu typuzmiennej.
no wreszcie dobrnalem do konca tego zadania, dzieki podpowiedziom o zerach okazalo sie ze ze 100 linijek programu potrzebna byla ledwie polowa z tego, w dodatku zajeta glownie przez switcha...
zrobilem tez proby ale na wszelki wypadek chcialem dopytac: czy ograniczenia wprowadzanych danych sa gdziekolwiek brane pod uwage? napisalem 2 funkcje sprawdzajace czy uzytkownik nie wpisuje liter lub cyfr nie mieszczacych sie w zakresie zarowno ilosci przypadkow do rozpatrzenia jak i samych podawanych liczb do obliczen. po usunieciu tych funkcji program tez przeszedl testy. tylko tu sie tak udalo czy to nigdzie nie jest weryfikowane?
PS przepraszam za moze lakoniczne pytanie ale jestem tu nowy i nie dokonca jeszcze ogarniam co i jak. zanim padla stronka to korzystalem z kuzniprogramistow gdzie wszystkie warunki byly bardzo dokladnie wytlumaczone i weryfikowane : )
Ograniczenia są podane tylko po to, aby "zawodnicy" mieli ogólne [a nawet szczegółowe] pojęcie o dziedzinie zadania, np po to aby odpowiednio dobrać typy zmiennych lub wielkość tablicy - jeżeli będzie w programie używana. To autor zadania nakłada takie ograniczenia na dane i przygotowywuje
je tak aby spełniały te ograniczenia. Ty nie musisz już tego sprawdzać.
Rozwiązanie tego zadania nie wymaga w ogóle liczenia silni, to nie jest zadanie z zakresu wymyślania algorytmów czy ćwiczenia się w kodzie.
To zwykła ordynarna zagadka matematyczna. Do rozwiązania zestawem ifów albo jednym case'm czy switchem.
To co ktoś już napisał, należy udać się na stronę silni na wikipedii, albo samemu sobie na kartce rozpisać silnię do powiedzmy 10 i zauważyć pewną tendencję na pierwszym i drugim miejscu w liczbie, licząc od prawej,
Myślę, że już wystarczająco podpowiedziałem. Żadnego algorytmu, żadnych pętli, żadnego dzielenia, żadnego modulo. Z przykładu w zadaniu "Jeżeli wprowadzona liczba to 4, liczba dziesiątek to dwa, jedności to 4".
Bardzo mały fragment mojej dłuższej rozmowy na skype z aktywnym użytkownikiem SPOJA:
[10:41:08] mietko52: Jak czytam coś takiego, to:
[10:41:40] mietko52: 1. Scyzoryk otwiera mi się w kieszeni.
[10:41:52] mietko52: 2. Żygać mi się chce
[10:43:28] mietko52: 3. Odechciewa mi się myślenia o wymyślaniu nowych, czasami takich, a czasami lepszych zadań, bo po co, aby [potem] czytać takie komentarze?
[10:44:21] ..........: Jakie?
[10:44:22] mietko52: Oczywiście każdy ma prawo do swojego zdania, więc moje jest takie jak powyżej.
[10:44:45] mietko52: A sorrry:
[10:44:48] mietko52: http://discuss.spoj.com/t/496-tylko-dwie-cyfry-silni-a-problemow-100-silnia/11466/20
[10:45:34] mietko52: oraz tego samego mądrali: http://pl.spoj.com/problems/FCTRL3/#comments67
zostawiam to bez komentarzy.