为了找到多项式系数,我编写了以下代码,但是同样的答案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;
}
非常感谢任何帮助。
答案 0 :(得分:4)
您正在行
中执行整数除法 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
是未初始化的,也就是您从函数返回的那个。{/ p>
提高编译器的警告级别可能会发现该问题。使用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;
}