1 / 59
Nov 2015

Co w moim kodzie zajmuje tyle czasu, że ciągle nie mogę zaliczyć zadania?

#include <iostream>

using namespace std;

int d,n,silnia=1;

int main()
{
    cin>>d;
    for(int i = 1; i<=d; i++)
    {
        cin>>n;
        for(int j=n; j>1; j--)
            {
                silnia = silnia*j;
            }
        cout<<silnia/10<<" "<<silnia%10<<endl;
    }

    return 0;
}

Użycie funkcji rekurencyjnej też nie pomaga confused

  • created

    Nov '15
  • last reply

    Oct '23
  • 58

    replies

  • 5.6k

    views

  • 24

    users

  • 19

    likes

  • 17

    links

Frequent Posters

There are 58 replies with an estimated read time of 10 minutes.

Zły algo , silnia szybko wyjdzie poza zakres jakiejkolwiek zmiennej z c++ (np 100 silnia to wg mojego pythona3 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000). Wypisz sobie silnie do kilkunastu i przyjrzyj się potrzebnym ci końcówkom, a także dorób obsługę wielu liczb

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ć wink aż się prosi o użycie warunków .

2 months later

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.

Hej smile
Ja spojrzałem na wikipedię i po prostu to postanowiłem switchem spróbować załatwić, (w końcu gdy mamy jakies a! to gdy a>9 to wypisujemy po prostu "0 0", a reszte mozna na opcje rozpisac) i mi wychodzi że zły wynik, mimo że gdy kompiluje w c::b to wyskakuje wszystko ladnie.

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. wink

PS
Bardzo ciekawe historyjki znajdziesz np tu: http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=1&t=1214&sid=d2eda26d0adacdeab4e8df238ac21e6e135

Dodaj znak końca linii do couta w dla case 0 i usuń kod z forum bo ci zaliczy.

Witam ja mam problem ze swoim kodem.

Po dokonaniu kilku poprawek, zamiast błędnej odpowiedzi sędzie twierdzi że przekroczyłem limit czasu. Silnia jest liczona jedynie do 9 więc myślałem że nie będzie problemu.
tutaj tej nowy

Zrób test:
1
10

i odpowiedz sobie dlaczego odpowiedizą u Ciebie dla liczb wiekszych od 9 jest podwójne 0 0, czyli:
0 0
0 0

zamiast 0 0. smile Jak coś to pytaj smile

Ps: może podpowiem, że chodzi o małe słówko 'else' w pewnym miejscu. Poza tym ten if(D>0 && D<30) jest niepotrzebny smile

Nie wiem jak znalazłeś ten błąd, ja pomimo wielu kompilacji nie doszukałem się podwójnych zer smiley
Idąc szlakiem tego else postanowiłem do niego dopisać ifa, jednak sędzi ten pomysł się chyba nie podoba. Pokazuje błąd odpowiedzi.

@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:

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.

Po cięzkich bojach dostałem AC - dzięki narbej!
Nie wpadłbym na to bez Twojej pomocy!

1 month later

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ć.