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

Dwumiany spoj - błędna odpowiedź

VPS Starter Arubacloud
0 głosów
410 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,100 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 237 wizyt
pytanie zadane 10 marca 2020 w SPOJ przez wojtek_suchy Mądrala (6,880 p.)
0 głosów
2 odpowiedzi 452 wizyt
pytanie zadane 6 marca 2017 w C i C++ przez Andruh Początkujący (390 p.)
0 głosów
2 odpowiedzi 241 wizyt
pytanie zadane 19 grudnia 2016 w C i C++ przez Philip Bywalec (2,320 p.)

92,452 zapytań

141,262 odpowiedzi

319,080 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...