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

Dwumiany spoj - błędna odpowiedź

Object Storage Arubacloud
0 głosów
415 wizyt
pytanie zadane 2 lutego 2020 w C i C++ przez cupoforanges Początkujący (380 p.)

)Cześć

Zajmuję się zadaniem dwumiany ze spoja. link: https://pl.spoj.com/problems/BINOMS/

Przejrzałem już 10 tematów, próbowałem zmieniać typy zmiennych, sposoby liczenia silnii, nawet porobiłem ify do sytuacji wyjątkowych typu (0,0) (123,123), (12,0) itd. Dodatkowo sprawdzałem wyniki na wolframie i wszystko się zgadzało. Sędzia zwraca błędną odpowiedź, proszę o pomoc

#include <iostream>
#include <iomanip>

using namespace std;

long double factorial(long double &f)
{
        for(int i = f-1; i >= 1; i --)
        {
            f*=i;
        }

        return f;
}

int main()
{
    long double n;
    long double k;
    long double nk;

    int t;
    cin >> t;

    for(int i = 0; i < t; i ++)
    {
        cin >> n >> k;

        nk = n-k;

        cout << setprecision(10);
        if((n==0)&&(k==0)) cout << 1 << endl;
        else if((n!=0)&&(k==0)) cout << n << endl;
        else if(n==k) cout << 1 << endl;

        else cout << factorial(n)/(factorial(k)*factorial(nk)) << endl;
    }

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 2 lutego 2020 przez adrian17 Ekspert (344,860 p.)
Spróbuj wypisać i zweryfikować wartości wychodzące z factorial().

To, że wynik "nie przekracza 1 000 000 000" nie oznacza, że licznik/mianownik go nie przekracza.
komentarz 2 lutego 2020 przez cupoforanges Początkujący (380 p.)
Zgadza się, wynik chociażby 100!, jest niepoprawny, domyślam się, że błąd leży w typie long double, ale gdy próbuję zmienić na np. long long int to to komputer nawet 80! nie policzy, co należy zrobić?
komentarz 2 lutego 2020 przez k222 Nałogowiec (30,150 p.)
Po co wyliczać całą silnię? Przyjrzyj się symbolowi Newtona, tam się większość rzeczy skraca, wystarczy to ładnie zapisać. Wyliczanie silni to zawsze zły pomysł że względu na szybko rosnące wartości
komentarz 3 lutego 2020 przez cupoforanges Początkujący (380 p.)

Wyliczałem silnię bo taka była moja pierwsza myśl na program, a skoro wyniki programu zgadzały się z wolframem to stwierdziłem, że w silnii błąd nie leżał. Poprawiłem program, ale teraz wywala błąd wykonania(SIGFPE). Sprawdziłem kod i wydaje mi się, że nie dzielę przez zero ani nic takiego. Bez ifa w linii 42 dla danych wejsciowych (1,20,19) wypluwał dziwne wyniki. Jakieś propozycje co mogę poprawić? Oto kod

#include <iostream>

using namespace std;

int K(int f)
{
    for(int i = f-1; i >= 1; i --)
    {
        f*=i;
    }

    return f;
}

int NK(int nk, int n)
{
    for(int i = nk+1; i <= n; i ++)
    {
        nk*=i;
    }

    return nk;
}

int main()
{
    int n, k, nk;
    int t;

    cin >> t;

    for(int i = 0; i < t; i ++)
    {

        cin >> n >> k;

        nk = n - k + 1;

        if((n==0)&&(k==0)) cout << 1 << endl;
        else if((n!=0)&&(k==0)) cout << n << endl;
        else if (n==k) cout << 1 << endl;
        else if ((n==k+1)) cout << n << endl;// o tym ifie mowa
        else cout << NK(nk,n)/K(k) << endl;
    }

    return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 243 wizyt
pytanie zadane 10 marca 2020 w SPOJ przez wojtek_suchy Mądrala (6,880 p.)
0 głosów
2 odpowiedzi 472 wizyt
pytanie zadane 6 marca 2017 w C i C++ przez Andruh Początkujący (390 p.)
0 głosów
2 odpowiedzi 243 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez Philip Bywalec (2,320 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...