多项系数代码总能提供相同的答案

时间:2018-06-08 18:31:47

标签: c++ multinomial mathematical-expressions

为了找到多项式系数,我编写了以下代码,但是同样的答案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;
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

问题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是未初始化的,也就是您从函数返回的那个。{/ 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;
}