Задача 1
Вы выполняете целочисленные деления в строке
b *= n/i;
Измените его на
b *= 1.0*n/i;
Задача 2
Этоковарная проблема.
double b;
int s1 = n;
for ( int s1 = n, b = 1, i = 0; i <= a.size(); ++i, s1 = s1 - a[i-1] )
b *= binom(s1, a[i]);
return b;
b
в цикле, где вы используете b = 1
, к сожалению, не то же самое b
, объявленное в начале функции.Поскольку вы используете int s1 = n, b = 1,
, b
в цикле представляет собой отдельную переменную типа int
, определенную в области действия цикла.Следовательно, b
, объявленный в верхней части функции, неинициализирован, и это тот, который вы возвращаете из функции.
Повышение уровня предупреждения вашего компилятора могло бы выявить эту проблему.С g++ -Wall
я получаю следующее предупреждение.
socc.cc:23:11: warning: ‘b’ is used uninitialized in this function [-Wuninitialized]
return b;
^
Измените эту функцию на:
double multi(int n, vector<int> a)
{
// Initialize all the variables. Then, the init part of the loop can be empty.
double b = 1;
int s1 = n;
int i = 0;
for ( ; i <= a.size(); ++i, s1 = s1 - a[i-1] )
b *= binom(s1, a[i]);
return b;
}