Witam. Rozwiązuje zadanie http://pl.spoj.com/problems/BINOMS/ lecz niektóre przypadki przekraczają mi długość zmiennych i robi się bałagan. Np. w przypadku 500 nad 400 już się wszystko sypie, bo program licząc 100! lub mnożąc liczby w liczniku (w tym wypadku 401*402*...*500) przekracza double i zamiast zer na końcu https://pl.wikisource.org/wiki/Silnia po przekroczeniu są różne cyfry. Nie mam zielonego pojęcia jak uprościć jeszcze to działanie. Chciałbym jeszcze wspomnieć, że zadanie dotyczy tylko przypadków, gdy wynik jest poniżej miliarda.
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
int n,k,t,roznica,j;
double licznik,wynik;
double silnia(int s)
{
if(s==0) return 1;
else return s*silnia(s-1);
}
int main()
{
cin>>t;
for(int i=1; i<=t; i++)
{
cin>>n>>k;
if ( (k == 0) || (n == k) )
{
cout << "1" << endl;
}else
if((n-k)>(n/2))
{
k=n-k; // zmiana, by była mniejsza silnia w mianowniku
}
if ( (k != 0) && (n != k) )
{
roznica= n-k;
cout<<setprecision(1000000);
licznik= k+1;
j=2;
for(int i=2; i<=roznica; i++) //mnożenie tego co zostało w liczniku po skróceniu tych samych silni w liczniku i mianowniku
{
licznik*= k+j;
j++;
}
wynik= ( licznik / silnia(roznica) );
cout<<wynik<<endl;
}
}
return 0;
}