41 / 59
Dec 2018

działa dla niewielkiego zakresu wejścia - to że test z zadania daje poprawny wynik, to za mało :slight_smile:

sprawdź wynik np. dla:

1
100

Wyszlo “0 8” ale srednio mam gdzie sprawdzic poprawnosc tego poniewaz jest to ogromna liczba.
Czy python moze w zmiennej przechowywac tak duza liczbe?

A czytania ze zrozumieniem wątku nie próbowałeś ? Nawet jest podana wartość silnii 100… Wystarczy przeczytać 3 posty od góry…

dziekuje bardzo za wskazowki :wink: Udalo sie zaliczyc :smiley:

22910244
2018-12-19 21:20:37
krzysztof
Dwie cyfry silni
zaakceptowano

2 months later

Ktoś wie czemu spoj mi tego nie zalicza?

#include <iostream>
#include <string>

using namespace std;

int main()
{

int n,liczba, y, d, j;
string x;
cin>>n;
for(int i=0;i<n;i++)
{
    cin>>liczba;

    if(liczba<4)
    {
        if(liczba==0) cout<<0<<" "<<1<<endl;
        else cout<<0<<" "<<liczba<<endl;
    }
    else if(liczba<10)
    {
        if(liczba==4) cout<<2<<" "<<4<<endl;
        else if(liczba==5||liczba==6||liczba==8) cout<<2<<" "<<0<<endl;
        else if(liczba==7) cout<<4<<" "<<0<<endl;
        else if(liczba==9) cout<<8<<" "<<0<<endl;
    }
    else
    {
        cout<<0<<" "<<0<<endl;
    }

}


return 0;
}
4 years later

Hej, a wie ktoś czemu mi wyrzuca timeout?

#include <iostream>
#include <math.h>
using namespace std;

int wynikSilni = 1;
int silnia(int liczba) {
    if(liczba == 0 || liczba == 1) return wynikSilni;
    return liczba * silnia(liczba-1);
}

int ile;

int main() {
    cin >> ile;
    int tab[ile];
    int rozdzielona[2];
    for (int i = 1; i <= ile; i++) {
        cin >> tab[i];
        string wynik = to_string(silnia(tab[i]));
        int jednosci = wynik.length() - 1;
        int dziesiatki = wynik.length() - 2;
        if(wynik[dziesiatki] == NULL) {
            wynik[1] = wynik[jednosci];
            wynik[0] = '0';
            dziesiatki++;
            jednosci++;
        }

        cout << wynik[dziesiatki] << " " << wynik[jednosci] << endl;
    }
}
  1. Uruchomiałeś swój kod na Ideone? Nie uruchamiałeś. To zrób to i zobacz jakie cuda są na wyniku.
  2. Drugi problem (dotyczący 99% błędnych rozwiązań) jest opisany wiele razy, nawet w tym wątku, kilka postów wyżej.

Podziwiam za cierpliwość. Na ten wątek i chyba o liczbach pierwszych zaglądam żeby sprawdzić na jakie “rewelacyjne” pomysły powpadały…

Masz rację, liczby pierwsze i silnia biją rekordy :slight_smile: dodałbym do tego jeszcze “Czy umiesz potęgować”.
Kilka lat temu przeczytałem na jakimś forum, że SPOJ jest beznadziejny, bo odrzucają dobre rozwiązania zadań. Podał przy tym przykład swojego “dobrego” rozwiązania. Zaciekawiło mnie to, wszedłem na SPOJ i tak to się dla mnie zaczęło… :sunglasses:

To są trzy pierwsze zadania na liście zadań łatwych, a w łatwych to nie są najłatwiejsze zadania. Można tę listę posortować w/g ilości AC rozwiązań, ale skąd to mają wiedzieć początkujący, a to sortowanie i tak nie do końca “wyciągnie” wszystkie najłatwiejsze zadania na początek posortowanej listy.

Wg mnie największym problemem w kontekście (także tych) zadań jest profil osób wchodzących na SPOJa. Nie, żebym profilował nowych, ale wg mego wyobrażenia: 1) umiem zrobić Hello World 2) na kółku z infy zrobiłem kółko i krzyżyk, 3) ktoś mi powiedział, że SPOJ jest taki super i takie zadania dla programistów

No i zaczynamy serię rozczarowań, bo na owym kółku uczyli nas liczyć n! jak wyżej, a tu nagle zonk - matematyka. Do tego wystarczy byle kurs / bootcamp / … - i znowu niespodzienka - Adaś chciał zostać progamistą stron www, a tu klepanie kodu dla klienta pokrywa się ze SPOJem jak zagadki matematyczne i zadania szachowe z egzaminem z algebry, jeśli nie słabiej.

I w sumie rozumiem zawód, bo Ci ludzie zostali oszukani. SPOJ nigdy nie oferował zadań na klepanie ERPów, a z współczesnym IT ma mało wspólnego. Tu nie ma zewnętrznych libek, w C++ chyba nawet boosta nie ma, nie robimy animacji, nie ogarniamy systemu, nie klepiemy if(byłEnter) {wyświetlWiedźmina}. Są zadania raczej matematyczne, którymi ludzie rzadko się interesują, a których przydatność w realu też jest niska (kiedy ostatnio klepaliście KMP?).

Sorki, ale używanie mózgu przydaje się i w klepaniu kodu dla klienta i we współczesnym IT. Jak ktoś nie potrafi przeczytać wątku gdzie rozwiązanie podane na tacy, lub nie potrafi zrozumieć/znaleźć co to są liczby pierwsze i jak je się znajduje to raczej nie wróży to dobrze jego karierze programisty…

Czy nie jest tak, że to ludzie sami się oszukują oczekując czegoś innego niż oferuje im SPOJ. Spoj nie jest jakimś cudownym lekarstwem, panaceum, które za rączkę przeprowadzi każdego chętnego od wieku raczkowania do profesjonalnego programisty. Jeżeli ktoś stosuje zasadę 3 x Z, zakuj, zalicz, zapomnij, to spoj jest tylko małym ogniwem w tym łańcuchu - zaliczeniem, tego czego użytkownik nauczył się lub znalazł czy wyklikał i nie od spoja zależy co z tą wiedzą zrobi. Może to Ty @tarpauwatratar wprowadzasz w błąd i oszukujesz i siebie i oszukujesz innych wypisując swoje wymagania i niesprawdzone informacje. Nauka algorytmów to nie nauka korzystania z bibliotek. Nie ważne jak napiszesz [wyklepiesz] kod, jeżeli daje poprawne wyniki, to dostajesz AC. Nie musisz pisać obiektowo, czystym kodem, czy używać lub nie bibliotek - przecież je tu masz np dla C++, spróbowałeś chociaż to sprawdzić? Jeżeli nie to po co piszesz takie bzdury!?

PS
Jeżeli klepiesz to jesteś klepaczem, koderem, kopistą, copy-pasterem, a nie programistą :wink:

PS 2
Czy na twoim kółku informatycznym próbowaliście policzyć silnię z 1 000 000 000? I sprawdzić ile to zajmuje czasu? To zadanie możesz rozwiązać dokładnie tak jak uczyłeś się na kółku. Możesz napisać funkcję silnia, może być rekurencyjna lub iteracyjna, ale z małym, pojedynczym if’em. Jeżeli n jest większe od … to od razu podajesz wynik, jeżeli nie, a n jest “wystarczająco” małe to możesz obliczyć silnie tradycyjnie. Nie potrzeba tu stada if - else albo case swichów. ALe nie zależnie jak to zrobisz, jeżeli podasz poprawnie dwie ostatnie cyfry n!, to spoj zaliczy Ci zadanie.

Tak, masz rację @yula. Tylko pytanie, czy to jest aż taka prosta sytuacja.

Fakt, że wystarczy zerknąć na forum by wiele zrozumieć. Ale jeśli robisz np. zadania domowe na szybko, cóż… . Ludziom się nie chce. Wróćmy do silni. Jesteś w podstawówce, ogarniasz tabliczkę mnożenia. Czy przerasta Cię obliczenie silni? Nie. No to liczymy: 1!, 2!, … , 10!. Pytanie od nauczycielki: jaka będzie ostatnia cyfra 11!, 12!, … n!? Dzieci wszystko widzą i wiedzą!

A teraz robimy im “wodę z mózgu” przez lata edukacji, finalnie jasno wskazując, że w programowaniu chodzi o to, żeby zaklepać obliczanie n!. Jak to zrobić? Prosto: pierwsze zadanie w LO: oblicz resztę z dzielenia liczby x przez y. Czyli ludzie poznają magiczny znaczek %. Drugie zadanie: rozwiąż równanie liniowe. Trzecie: rozwiąż kwadratowe. A w domu połączcie to wszystko robiąc coś ciekawego… hm… co by tu wymyślić… wiem! Wiecie co to silnia? Już wam pokażę, to takie mnożenie. I rozwiążcie na następny tydzień zadanie na SPOJu i policzcie (hehe, też adekwatne słowo) ostatnią cyfrę n!. No i ludzie liczą. Co więcej, na infie dostają za takie programy dobre noty!

Nie wierzycie, że tak jest? Ok, rozumiem. Ja sam nie wiem jak jest :slight_smile: Natomiast przypuszczam że tak, jak napisałem, bo… mój brat był na rozszerzonej infie i miał “kartkówkę” z cppa. Zadanie brzmiało: na wejściu nauczyciel wpisze jakieś dwie liczby, np. 123 oraz 7, a na wyjściu chce zobaczyć resztę z dzielenia pierwszej przez drugą. Nie, żeby ktoś wskazał zakresy danych wejściowych - ale z kontekstu wynikało, że mowa tylko o małych liczbach dodatnich.

Jak się to skończyło? Uwaga uwaga! To mocne! Przełożeniem kartkówki bo na poprzedniej lekcji nauczyciel zapomniał wspomnieć, że w C++ mamy operator % :slight_smile: I tak, sam się zdziwiłem i sprawdziłem klepiąc kod - zadanie dało się rozwiązać pozostałymi operatorami, które omówione na lekcji były. Btw, jest chyba zadanie na SPOJu dotyczące dzielenia z resztą. No, ale po co myśleć. Skoro nie kazali… .

Zgoda.

Też zgoda. Im więcej na SPOJu tym bardziej dziwi mnie własna głupota. W życiu jeszcze gorzej :wink:

Mi mówić tego nie musisz. Ale mogę na priv dać Ci sporo namiarów na osoby, które chętnie się dowiedza, w czym różnica między SPOJem, programowaniem, algorytmami, matematyką, informatyką, pracą, szkołą, … :slight_smile: A co do libek: nieliczne względem tych wykorzystywanych przez przeciętnego “klepacza”.

No tylko to właśnie trzeba ludziom powiedzieć. Wskazać, że to tzw. “zadanie z gwiazdką”. A nawet dwiema. A jak tego nie ma a nauczyciel / trener / guru / … kazało OBLICZYĆ, no to się nie dziwmy, że ludzie LICZĄ. Na lekcji rekurencja do liczenia silni była git. Już widzę, jak ktoś im tłumaczył, że tak się nie da w tym zadaniu bo cośtam.

Rozumiem wasze zastrzeżenia, ale proszę nie spamować więcej w tym temacie.

Dla szukających wskazówek odnośnie zadania, podpowiedzi i przykładowe testy znajdują się we wczesniejszych postach :arrow_double_up: