YaMemory 2016-11-01 13:37 采纳率: 100%
浏览 1270
已采纳

生日悖论问题使用C++产生溢出该如何解决

在编写生日悖论程序时,发现C++最多只能计算到7人,当输入参数为8人的时候产生溢出,我现在需要计算100个人中至少有两人的生日相同的概率为多少,请问该怎么解决这个问题。麻烦哪位大神帮忙解决一下。谢谢..
附上C++源码

 #include <iostream>
using namespace std;

//本程序计算生日悖论问题
//注:C++最多只能计算到7人,当输入参数大于7时,产生溢出,计算机无法计算

int main()
{
    double count(int number);
    int m;
    cout << "请输入参数m(人数):" << endl;
    cin >> m;
    cout << m <<"个人中至少两个人的生日相同的概率为:" << count(m);

    system("pause");
    return 0;
}

double count(int number)
{
    double result = 0;
    double NumeratorArrangeresult = 365;   //计算分子365的n次全排列
    double DenominatorPower = 365;               //计算分母365的n次方
    for(int i =1; i<number; i++)
        NumeratorArrangeresult *=  (NumeratorArrangeresult - 1);
    for(int j =1; j<number; j++)
        DenominatorPower *= DenominatorPower;

    result = 1-(NumeratorArrangeresult / DenominatorPower);

    return result;
}

/*数学原理
不计特殊的年月,如闰二月。先计算房间里所有人的生日都不相同的概率,那么 
第一个人的生日是 365选365 
第二个人的生日是 365选364 
第三个人的生日是 365选363 
: 
: 
: 
第n个人的生日是 365选365-(n-1) 
所以所有人生日都不相同的概率是: 
(365/365)× (364/365) ×(363/365) ×(362/365)× ... ×(365-n+1/365) 
即为:An 365/365^n
那么,n个人中有至少两个人生日相同的概率就是: 
1-(365/365)× (364/365) ×(363/365) ×(362/365)× ... ×(365-n+1/365)
*/
  • 写回答

2条回答 默认 最新

  • Zedee 2016-11-02 03:39
    关注

    因为累乘的结果超过了存储上限导致的,试试这样:
    double count(int number)
    {
    double result = 0;
    double temp = 1;
    double NumeratorArrangeresult = 365; //计算分子365的n次全排列
    double DenominatorPower = 365; //计算分母365的n次方

    for(int j =1; j<=number; j++)
    {
        temp *= (NumeratorArrangeresult --) / DenominatorPower;
    
    }
    result = 1-temp;
    
    return result;
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊