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

SPOJ dwumiany

+1 głos
106 wizyt
pytanie zadane 3 czerwca w C i C++ przez Chrost Nowicjusz (150 p.)

Witam, pracując nad zadaniem ze SPOJa o dwumianach:
https://pl.spoj.com/problems/BINOMS/
Szukałem pomocy na forum i trafiłem na zagadnienie "symbol Newtona". Wykorzystałem to w swoim programie, program działa, oblicza przykłady ze SPOJa, jednak sędzia zwraca błędną odpowiedź. Ktoś doradzi gdzie szukać błędu?

#include <iostream>
#include <cmath>
using namespace std;

double symbolNewtona (double n, double k)
{
    double wynik = 1;
    for (int i=1; i<=k; i++)
    {
        wynik = (wynik*(n-i+1))/i;
    }
    return wynik;

}

int main()
{
    int ile;
    cin >> ile;

    for (int i=0; i<ile; i++)
    {   double wynik;
        double k,n;
        cin >>n>>k;
        cout << symbolNewtona(n,k) << endl;

    }
    return 0;
}

 

komentarz 4 czerwca przez Whistleroosh Nałogowiec (34,060 p.)
Jak się rozwiązuje tego typu zadania na SPOJu to lepiej unikać liczb zmiennoprzecinkowych
komentarz 4 czerwca przez Chrost Nowicjusz (150 p.)

Zmiana na inta nie pomogła. 

#include <iostream>
#include <cmath>
using namespace std;

int symbolNewtona (int n, int k)
{
    int wynik = 1;
    for (int i=1; i<=k; i++)
    {
        wynik = (wynik*(n-i+1))/i;
    }
    return round(wynik) ;

}

int main()
{
    int ile;
    cin >> ile;

    for (int i=0; i<ile; i++)
    {   int wynik;
        int k,n;
        cin >>n>>k;
        cout << symbolNewtona(n,k) << endl;

    }
    return 0;
}

 

komentarz 4 czerwca przez Whistleroosh Nałogowiec (34,060 p.)
edycja 5 czerwca przez Whistleroosh
W linii 10. dzielisz inta przez inta, co też zwraca inta. Więc ten round w linii 12. nic nie robi.

2 odpowiedzi

0 głosów
odpowiedź 4 czerwca przez pich Nowicjusz (140 p.)
Zastosuj zaokrąglenie w funkcji wynik. Funkcja powina zwracać liczbę całkowitą.
komentarz 4 czerwca przez Chrost Nowicjusz (150 p.)
#include <iostream>
#include <cmath>
using namespace std;

int symbolNewtona (int n, int k)
{
    int wynik = 1;
    for (int i=1; i<=k; i++)
    {
        wynik = (wynik*(n-i+1))/i;
    }
    return round(wynik) ;

}

int main()
{
    int ile;
    cin >> ile;

    for (int i=0; i<ile; i++)
    {   int wynik;
        int k,n;
        cin >>n>>k;
        cout << symbolNewtona(n,k) << endl;

    }
    return 0;
}

Zmiana typu na int oraz zaokrąglenie nie pomogły.

0 głosów
odpowiedź 5 czerwca przez Great Dyskutant (7,860 p.)
long long symbolNewtona(long long n, long long k)
{
	if (2 * k > n)
		k = n - k;
	long long wynik = 1;
	for (int i = 1; i <= k; i++)
    {
		wynik = wynik * (n - i + 1) / i;
    }
	return wynik;
}

Podobne pytania

0 głosów
1 odpowiedź 62 wizyt
pytanie zadane 17 listopada 2021 w C i C++ przez Endersik Nowicjusz (160 p.)
0 głosów
1 odpowiedź 248 wizyt
pytanie zadane 2 lutego 2020 w C i C++ przez cupoforanges Początkujący (380 p.)
0 głosów
0 odpowiedzi 147 wizyt
pytanie zadane 10 marca 2020 w SPOJ przez wojtek_suchy Mądrala (6,810 p.)

88,677 zapytań

137,288 odpowiedzi

306,652 komentarzy

58,873 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...