3

我正在尝试为以下公式制作一个 C++ 程序:

在此处输入图像描述

我做了选择功能的一部分:

#include <iostream>
#include <fstream>
using namespace std;


int choose();
void binomialdistribution();

int main(){
  choose();
  binomialdistribution();
}

int choose() {
  double n = 3;
  double k = 0;
  double i;
  double b;
  double value;
  while (k <= n){
    if (0 == k || n == k) {
      return 1;
    }
    if (k > n) {
      return 0;
    }
    if (k > (n - k)) {
      k = n - k;
    }
    if (1 == k) {
      return n;
    }
    b = 1;
    for (i = 1; i <= k; ++i) {
      b *= (n - (k - i));
      if (b < 0){
          return -1;
      }
      b /= i;
    }
    return b;
    cout << k;
    k++;
    binomialdistribution();
  }
}

void binomialdistribution(){
  cout << choose();
}

我的 k 输出为空白,我的 choose() 输出为 0000000000000000000000

任何帮助将不胜感激

4

3 回答 3

0

您可以使用模板编程,这样您就可以编写更少的锅炉代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>    // std::sort
using namespace std;


template <unsigned int N, unsigned int K>
struct Binomial
{
    enum
    {
        value=Binomial<N-1,K-1>::value + Binomial<N-1,K>::value
    };
};

template <unsigned int N>
struct Binomial<N,0>
{
    enum
    {
        value=1
    };
};

template <unsigned int N>
struct Binomial<N,N>
{
    enum
    {
        value=1
    };
};


int main(void)
{
    std::cout<<" Binomial<10,1> = ";
    std::cout<< Binomial<10,1>::value;
    std::cout<< std::endl;

    std::cout<<" Binomial<8,3> = ";
    std::cout<< Binomial<8,3>::value;
    std::cout<< std::endl;
}

输出:

二项式<10,1> = 10

二项式<8,3> = 56

于 2014-05-03T20:53:28.810 回答
0

从您的程序中,从 main 调用“选择”并且未给出返回值。另外,您的“k”将始终等于 0,因为来自 while 循环。它首先检查 k 是否等于 0 并返回 1。(注意没有变量可以放入返回值。)然后从二项分布中调用“选择”。(请注意,您没有更改 k 的值。它将始终为零!)。(请注意,您在程序中调用了两次选择)

于 2014-04-02T21:22:27.560 回答
0

尝试这个

#include <cmath>
#include <stdio.h>

int main(){
    double p; 
    int k;
    int n;

    scanf("%d%d", &n, &k);
    scanf("%lf", &p);

    if (k > n) return 1;
    if (p > 1 || p < 0) return 1;

    double w = 1;   //neutral element of multiplication

    // n choose k part
    for (int i = n - k + 1; i <= n; ++i) w = w * i;
    for (int i = 1; i <= k; ++i) w = w / i;

    // p^k * (1-p)^(n-k) part
    w = w * pow(p, k) * pow(1.0 - p, n - k);

    printf("%lf\n", w);
    return 0;
}

询问是否有不清楚的地方。

还要记得用-lmflag编译

于 2014-04-02T21:46:45.200 回答