📄 sy1-5.cpp
字号:
//SY1-5.cpp
//题目:
//计算生日不重复概率
//用彷真的方法, 利用随机数产生每个同学的生日,
//计算出生日不重复的概率并与前面的结果进行比较
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
using namespace std;
inline void Probability( int );
inline void Emulate( );
bool LeapYear( int );
inline void birth_unique( int [ ][ 3 ], int );
inline void Probability( int numb )
{
//计算生日不重复概率
double a = 1.0; //分子
double b = 1.0; //分母
double p; //生日不重复的概率
cout<<"学生人数:"<<numb<<endl;
for( int i = 0; i < numb; i++ )
{
b *= 365;
a *= 365 - i;
}
p = a / b;
cout<<"概率是:"<<p<<endl;
}
inline void Emulate()
{
//仿真求得每个同学的生日
int numb;
int day;
int month;
int year;
int month_day;
int ( *birthday )[ 3 ];
cout<<"仿真每个同学的生日,请输入学生人数:"<<endl;
cin>>numb;
birthday = new int [ numb ][ 3 ];
for( int i = 0; i < numb; i++ )
{
year = 1986 + rand() % 3;//假定生日在1986-1988之间
month = 1 + rand() % 12;//随机产生月份
switch ( month ) //确定天数
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12 :
month_day = 31;
day = 1 + rand() % month_day;
break;
case 4 :
case 6 :
case 9 :
case 11 :
month_day = 30;
day = 1 + rand() % month_day;
break;
case 2 :
if ( LeapYear( year ) )
{
month_day = 29;
day = 1 + rand() % month_day;
break;
}
else
{
month_day = 28;
day = 1 + rand() % month_day;
break;
}
}
birthday[ i ][ 0 ] = year;
birthday[ i ][ 1 ] = month;
birthday[ i ][ 2 ] = day;
}
birth_unique( birthday, numb );
delete[] birthday;
}
bool LeapYear( int y )
{
//判断闰年
return ( y % 4 == 0 && y % 100 != 0 || y % 400 == 0 );
}
inline void birth_unique( int birthday[ ][ 3 ], int numb )
{
//计算仿真后生日概率
int flag = 0;
float p;
int i;
int j;
cout<<numb<<"位同学的生日是:"<<endl;
for( i = 0; i < numb; i++ )
cout<<setfill('0')<<setw(3)<<i+1<<": "<<birthday[ i ][ 0 ]<<"年"<<setw(2)<<birthday[ i ][ 1 ]<<"月"<<setw(2)<<birthday[ i ][ 2 ]<<"日"<<endl;
for( i = 0; i < numb; i++ )
for( j = 0; j < numb; j++ )
if( birthday[ i ][ 1 ] == birthday[ i + 1 + j ][ 1 ] && birthday[ i ][ 2 ] == birthday[ i + 1 + j ][ 2 ] )
flag++;
p = ( static_cast<float> ( numb - flag ) ) / numb;
cout<<endl<<"flag = "<<flag<<endl;
cout<<"仿真后"<<numb<<"人生日概率: "<<p<<endl;
}
int main()
{
int numb; //学生人数
srand( time( 0 ) );
Probability( 50 );
Probability( 100 );
cout<<"输入学生人数:"<<endl;
cin>>numb;
Probability( numb );
Emulate();
cin>>numb;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -