Masz kilka błędów.
Po pierwsze funkcja dwumian_Newtona zwraca typ bool, a ty nie zwracasz nic, także warto ją zamienić na typ void.
Po drugie warunek pętli while jest zły ponieważ ona się wykonuje do momentu kiedy n i k są różne od zera, więc jeśli jedno z nich jest równe 0 kończy działanie.
Najpierw w tej while wyświetlasz dane a dopiero potem pobierasz nowe, dlatego jeśli pętla się kończy to zostawiasz te 2 liczby i nic z nimi nie robisz, proste rozwiązanie wywołać jeden raz funkcję po while.
Drobne nieścisłości jakieś jeszcze się znajdą ale to już mniejsza. Na dole poprawiony kod, aby działał.
#include <iostream>
using namespace std;
void dwumian_Newtona(int n, int k)
{
int roznica_nk = (n - k);
unsigned long int wynik = 1;
int najwieksza = 0;
int obroty = 0;
// sprawdzam newralgiczne przypadki
if (k == 0 || k == n)
{
cout /*<< "tu: "*/ << "wynik: 1" << endl;
return;
}
else
{
// sprawdzamy która silnia w mianowniku jest większa, aby później mogła zosatć skrócona z licznikiem
if (k > roznica_nk)
{
najwieksza = k;
obroty = roznica_nk;
}
else
{
// liczba obrotow calego programu zalezy od liczby w mianowniku
najwieksza = roznica_nk;
obroty = k;
}
// metoda z lekcji (sasiednia para w liczniku/pierwsza liczba z mianownika), wynik poprzedni*nastepna z licznika/2 liczba w mianowniku itd.
int y = 1;
while (y < obroty)
{
for (int i = (najwieksza + 1); i <= n; i++)
{
//cout << "i: " << i << " i+1: " << i + 1 << endl;
//cout << "y: " << y << endl;
wynik = (wynik * (i) / y);
//cout << "Wynik w petli: " << wynik << endl;
y++;
}
}
}
cout << "wynik: " << wynik << endl;
}
int main()
{
int n = 0;
int k = 0;
cin >> n;
cin >> k;
while (!((n == 0) && (k == 0)))
{
dwumian_Newtona(n, k);
cin >> n;
cin >> k;
}
dwumian_Newtona(n, k);
cout << "out of while!" << endl;
return 0;
}