• 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 }

    结果截图:

  • 相关阅读:
    转载一个好用的div弹出层插件
    asp.net 母版页使用方法
    visual studio 代码排版组合键
    模仿米折网商品图片自动翻页效果
    BinaryWriter 、BinaryReader在读写
    Java 8 Lambda 表达式
    IBeacon协议分析
    Centos配置jdk和tomcat环境
    apidoc 生成Restful web Api文档
    数组和链表的区别
  • 原文地址:https://www.cnblogs.com/csxcode/p/3751729.html
Copyright © 2020-2023  润新知