zoukankan      html  css  js  c++  java
  • n个骰子的点数

    把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值和出现的概率。

    解法二:基于循环求骰子点数,比递归算法更加高端大气上档次

    具体代码如下,有详细注释。

     1 ////////////////基于循环求骰子点数//////////////////////////////////////////////////////////
     2 int g_MaxValue = 6 ;//骰子的点数个数
     3 void PrintProbability(int number)//number 为骰子个数
     4 {
     5     if (number < 1)
     6     {
     7         return;
     8     }
     9     int* pProbabilities[2];//int指针数组
    10 
    11      pProbabilities[0] = new int[g_MaxValue * number + 1];//多分配一个空间,0号位置不用
    12      pProbabilities[1] = new int[g_MaxValue * number + 1];//多分配一个空间,0号位置不用
    13 
    14     for (int i = 0 ; i < (g_MaxValue * number + 1) ; i++ )//数组初始化为0
    15     {
    16         pProbabilities[0][i] = 0 ;
    17         pProbabilities[1][i] = 0 ;
    18     }
    19 
    20     int flag = 0 ;//标记数组
    21     for (int i = 1 ; i <= g_MaxValue ; i++)
    22     {
    23         pProbabilities[flag][i] = 1 ; //取一个骰子,点数出现1到6的次数分别为1次
    24     }
    25 
    26     for (int k = 2 ; k <= number ; k++) //处理剩下的骰子
    27     {
    28         for (int i = 0 ; i < k ; i++) //k个骰子点数和最小是k,将小于k的次数赋值为0
    29         {
    30             pProbabilities[1 - flag][i] = 0 ;
    31         }
    32 
    33         for (int i = k ; i <= g_MaxValue * k ; i++) //依次处理k个骰子的所有可能点数和
    34         {
    35             pProbabilities[1 - flag][i] = 0 ;// 给点数和为i的出现次数赋值前先初始化为0
    36 
    37             for (int j = 1 ;j <= i && j <= g_MaxValue ; j++)//i 表示点数和为 i,j 表示最后一个骰子可以出现的点数
    38             {
    39                 pProbabilities[1 - flag][i] += pProbabilities[flag][i - j];
    40                 //i-j 表示前 k-1 个骰子的点数和 , 此时k个骰子的点数和为 i 的次数就是当第k个骰子点数为j 时前 k-1 个骰子的点数和为 i-j 的次数。
    41             }
    42         }
    43         flag = 1 - flag ;//调换数组
    44 
    45     }
    46 
    47     double total = pow((double)g_MaxValue , number) ;//可能情况的总数
    48     cout<<""<<"次数	"<<"概率"<<endl ; 
    49     for (int i = number ; i <= g_MaxValue * number ; i++)
    50     {
    51         double ratio = (double)pProbabilities[flag][i] / total ; //求概率
    52         cout<<i<<"	"<<pProbabilities[flag][i]<<"	"<<ratio<<endl; 
    53     }
    54 
    55     delete[] pProbabilities[0];
    56     delete[] pProbabilities[1];
    57 }
    58 
    59 
    60 int main()
    61 {
    62     int number = 3 ;
    63 
    64     PrintProbability(number);
    65     getchar();
    66     return 0;
    67 }

    结果截图:

  • 相关阅读:
    L3-015. 球队“食物链”【DFS + 剪枝】
    L3-002. 堆栈【主席树 or 线段树 or 分块】
    PTA L1-006 连续因子【暴力模拟】
    【路由和交换之H3C自导自演】
    【ospf-stub区域配置】
    【ospf-链路验证】
    【ospf-vlink虚拟连接】
    【c学习-14】
    【c学习-13】
    【php学习-5】
  • 原文地址:https://www.cnblogs.com/csxcode/p/3751729.html
Copyright © 2011-2022 走看看