Полиномиальный коэффициент код всегда дает один и тот же ответ

Я написал следующий код, чтобы найти коэффициент многочлена, однако всегда остается один и тот же ответ, 2.122e-314. Я сидел на этом некоторое время, и не могу найти то, что не хватает. Мы должны делать это с помощью рекурсий. Мой код выглядит следующим образом:

#include<iostream>
#include<vector>
#include<cerrno>
#include<cstring>

using namespace std;

double binom(int n,int a)
{
double b;
double i;
for (b = 1, i = 1;i <= a; ++i, --n)
b *= n/i;
return b;
}

double multi(int n, vector<int> a)
{
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;
}int main()
{
int n, k;
cout << "dimension k: ";
cin >> k;
vector<int> a(k);
cout << "n: ";
cin >> n;
cout << "a[0],...,a[k-1]: ";
for (int i = 0; i < k; ++i)
cin >> a[i];
cout << "Multinomialcoefficient: " << multi(n,a) << endl;
return 0;
}

Любая помощь с благодарностью.

2

Решение

Проблема 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;
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]