在编写生日悖论程序时,发现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)
*/
因为累乘的结果超过了存储上限导致的,试试这样:
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;
}
这是原来的写法的运行结果
使用了楼主的方法运行结果
同样是65的输入,可以被计算出来,并没有产生溢出。