Я написал следующий код, чтобы найти коэффициент многочлена, однако всегда остается один и тот же ответ, 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;
}
Любая помощь с благодарностью.
Вы выполняете целочисленные деления в строке
b *= n/i;
Измените это на
b *= 1.0*n/i;
Это коварная проблема.
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;
}
Других решений пока нет …