一道面试题

来源:互联网 发布:淘宝店铺新店扶持政策 编辑:程序博客网 时间:2024/06/03 05:07
 
一道面试题

 射击运动员10发打中90环有多少种可能,请编写程序计算出来,并打印出结果,0环和10环均有效。
  
  打中90环就是没打中10环,所以打中90环跟打中10环的可能性是一样的。
  然后开始递归狂打枪,一到10就记录(if(paramS + i == 10) {S++;break;});
  在循环的控制中已经排除了大于10的可能性(i<= 10 - paramS);
  如果不到10,并且还未打到10枪就继续打下一枪(else if(paramCount > 0)CountOut(paramS + i, paramCount - 1); );
  如果已经打足了10枪就结束。
  其中函数中的参数paramS是记录目前总共打了多少环了,paramCount记录还能打几枪。
  
  #include "stdio.h"
  int S = 0;
  
  void CountOut(int paramS, int paramCount)
  {
  for(int i = 0; i<= 10 - paramS; i++)
  {
   if(paramS + i == 10)
   {
   S++;
   break;
   }
   else if(paramCount > 0)
   CountOut(paramS + i, paramCount - 1);
   else
   break;
  }
  }
  
  main()
  {
   CountOut(0, 10);
   printf("%d", S);
  }
  
  
   一般的概率书上都有基本一样的例题的:10个箱子,把它们分成10份,只需要9个间隔;如果把这间隔和箱子看成是一样的东西,那就是10+9=19个位 置;在19个位置里选中9个位置,用来间隔,剩下的10个位置放箱子。或者在19个位置里选中10个位置放10个箱子,即C19,10,等于C19,9.
  
  10发中90环,等同于10发错失10环,等同于10发中10环,即把这10环分成10发,换个形象思维,等同于把10个箱子换成10份,即等同于在19个位置中选9个位置。
  即C19,9=19!/(9!×(19-9)),再优化一下算法。
  
  num = 1;
  for(i=1;i<=10;i++)
   num = num *(9+i)/i;
  printf("%d",num);
  
  计算结果:num=92378
原创粉丝点击