none
急啊!!抽样问题!这个作业星期五要交! RRS feed

  • 问题

  • 从n个n-1种形状的物件中,每次取出k个物件,求取到的每个物件的形状都不相同的概率

    这是我自己做的,老师让我回去改……

    #include<iostream>

    using namespace std;


    int main()

    {

     unsigned long int result,cNK,n,k,i,j,x=1,y=1;

     cout<<"请输入物件数量"<<"\n";

     cin>>n;

     cout<<"请输入每次取出的物件数量"<<"\n";

     cin>>k;

     if(k>n)

      cout<<"输入错误!"<<"\n";

     else
     {
      for(i=1;i<=k;i++)
      {
       y=y*(i++);
      }
      for(j=k;j<=n;j++)
      {
       x=x*(j++);
      }

      cNK=x/y;   //取出k个物件所有的可能数

      result=((n-1)*(n-2)*(n-3))/cNK;

      cout<<"取到的每个物件的形状都不相同的概率是:"<<   result<<"\n";
     }
     return 0;
    }

    各位大哥给个意见好吗?郁闷中……

    2010年5月11日 14:06

答案

  • 一些建议:

    • 你可以在纸上写出数学公式,然后把它转化成代码,并且在代码中标注哪一行与公式中的哪部分对应,以方便找错误
    • 先随便给n和k赋个值,用公式算出每一步中间过程,然后在代码中也把中间结果打印出来,比如在for循环中输出x和y的值,和手算的比较一下是否正确
    • 多想几个n和k的值,看看程序输出的和手算的一致不一致

    这样可以帮你尽快找出程序的错误


    Shuhai Shen - http://leonax.net
    2010年5月11日 16:40

全部回复

  • 一些建议:

    • 你可以在纸上写出数学公式,然后把它转化成代码,并且在代码中标注哪一行与公式中的哪部分对应,以方便找错误
    • 先随便给n和k赋个值,用公式算出每一步中间过程,然后在代码中也把中间结果打印出来,比如在for循环中输出x和y的值,和手算的比较一下是否正确
    • 多想几个n和k的值,看看程序输出的和手算的一致不一致

    这样可以帮你尽快找出程序的错误


    Shuhai Shen - http://leonax.net
    2010年5月11日 16:40
  • …………

    找到了,我算阶乘的时候,最后一步错了,谢谢Shuhai给的建议!这样的学习经验很重要啊,谢谢!非常感谢!

    另外,请教一个问题,如果我要算n个元素中取k个元素的所有组合数,用什么办法最好?我自己只想到了一个笨办法就是用for语句,可是这样做,算概率的时候还是要手工算出取单个元素的所有组合数,很麻烦,请问,VS2008里面有没有哪儿提供专门的数学计算公式的函数?

    我刚学,所以很菜,这样的问题可能大家都知道,我很白,还请大家给点指导……

    谢谢啦!

    2010年5月12日 11:04
  • 可能有专门的数学函数库提供类似的函数,但是C++标准库里是没有的。

    其实for循环并不是笨办法,有时候写程序只能这么写。你可以先写一个可行的程序,然后再优化,比如有两种for循环可以合并成一个之类的,写多了就熟了。


    Shuhai Shen - http://leonax.net
    2010年5月12日 16:45