求助:用c语言编写班级中两个人生日概率相同问题
发布时间:2025-05-14 10:55:54 发布人:远客网络
一、求助:用c语言编写班级中两个人生日概率相同问题
说明:由于计算机产生的是伪随机数,所以重复的几率比较高。
1年365天,用1到365表示。50个同学的生日用数组保存,随机产生一个1-365之间的数字作为生日
然后对数组进行相似判断,一旦有2个同学生日相同就返回1.然后计数器加1.最后处以总模拟的次数。
void randomBirthday(int a[],int n)
int isSameWithTwo(int a[],int n)
if(isSameWithTwo(birthday,50)==1)
printf("100000次测试,有%d次出现相同的,相同的概率是:%lf",same,same*1.0/100000);
100000次测试,有100000次出现相同的,相同的概率是:1.000000
【说明】随机数是伪随机数,而且模拟了10w次,这个概率是无限次接近1的。我测试了下,基本每一次都有2个生日是统一天的。所以概率是1.理论上是97%,大三组合数学上有证明的。
二、用C语言编写
#include<iostream.h>// cin及 cout
#include<malloc.h>//用到申请内存函数 malloc()和释放内存函数 free()
#include<string.h>//字符串处理
#include<stdio.h>//文件操作(读文件)
typedef struct linknode//定义节点的类型
struct telephone te;//联系方式
linknode* creatlist(int);//创建链表
nodetype* findnode(int);//通过查找序号返回节点的指针
nodetype* find(char c[]);//通过查找姓名返回节点的指针
int find2(char c[]);//通过查找姓名返回节点的序号
nodetype* insnode(int);//插入节点
nodetype* load();//初始化:从外部读入数据
void readstr(FILE*f,char*string);//读行函数
bool check(char*a, char*b);//对比两个字符串是否相等
void editperson(nodetype*);//编辑个人说明
void editscore(nodetype*);//编辑学科成绩
void edittelephone(nodetype*);//编辑联系方式
void dispname();//显示所有学生姓名
void dispnode(nodetype* p);//显示一个学生的所有信息
void dispperson(nodetype*);//显示一个学生的个人说明
void dispscore(nodetype*);//显示一个学生的学科成绩
void disptelephone(nodetype*);//显示一个学生的联系方式
bool List::check(char*a, char*b)//对比两个字符串是否相等
nodetype* List::creatlist(int n)//创建链表
h=(nodetype*)malloc(sizeof(nodetype));
s=(nodetype*)malloc(sizeof(nodetype));
t=s;//t始终指向生成的单链表的最后一个节点
void List::readstr(FILE*f,char*string)
fgets(string, 255, f);//fgets():从文件 f读入长度为 255-1的字符串
} while((string[0]=='/')||(string[0]=='\n'));
if((fp=fopen("student.txt","r"))==NULL)
cout<<"打开文件失败"<<endl;
sscanf(c,"The Length Of Link:%d",&num);//获取链表长度
void List::dispnode(nodetype* p)//显示一个学生的所有信息
void List::dispname()//显示所有学生姓名
cout<<"现有的学生:"<<endl;
cout<<"没有任何学生数据"<<endl;
cout<<"姓名:"<<p->pe.name;
int List::listlen()//返回链表长度
nodetype* List::findnode(int i)//通过查找序号返回节点的指针
if( i>listlen()||i<=0)// i上溢或下溢
while( p!=NULL&& j<i)//查找第 i个节点并由 p指向该节点
nodetype* List::find(char c[])//通过查找姓名返回节点的指针
strcat(c,"\n");//从外部读入的字符串末尾都带了一个换行符
while( p!=NULL&&!(check(c, p->pe.name)))//查找第 i个节点并由 p指向该节点
int List::find2(char c[])//通过查找姓名返回节点的序号
strcat(c,"\n");//从外部读入的字符串末尾都带了一个换行符
while( p!=NULL&&!(check(c, p->pe.name)))//查找第 i个节点并由 p指向该节点
nodetype* List::insnode(int i)
s=(nodetype*)malloc(sizeof(nodetype));//创建节点 s
if(i==0)//i=0时 s作为该单链表的第一个节点
p=findnode(i);//查找第 i个节点,并由 p指向该节点
else cout<<"输入的 i值不正确"<<endl;
void List::delnode(int i)//删除第 i个节点
p=findnode(i-1);//查找第 i-1个节点,并由 p指向这个节点
if(p!=NULL&& p->next!=NULL)
s=p->next;// s指向要删除的节点
cout<<"输入的 i值不正确"<<endl;
void List::editperson(nodetype* p)
cout<<"请输入姓名:"<<endl;
cout<<"请输入性别:"<<endl;
cout<<"请输入生日(格式举例:1982-1-1):"<<endl;
cout<<"请输入民族:"<<endl;
cout<<"请输入国籍:"<<endl;
cout<<"请输入学历:"<<endl;
cout<<"请输入家庭住址(例如:广西玉林市解放路11号)"<<endl;
cout<<"编辑个人信息完成!"<<endl;
void List::editscore(nodetype* p)
cout<<"请输入学号:"<<endl;
cout<<"请输入语文成绩:"<<endl;
cout<<"请输入英语成绩:"<<endl;
cout<<"请输入数学成绩:"<<endl;
cout<<"请输入物理成绩:"<<endl;
cout<<"编辑学科成绩完成!"<<endl;
void List::edittelephone(nodetype* p)
cout<<"请输入手机号码:"<<endl;
cout<<"请输入家庭电话号码:"<<endl;
cout<<"请输入学校电话号码:"<<endl;
cout<<"编辑联系方式完成!"<<endl;
void List::dispperson(nodetype* p)
cout<<"姓名:"<<p->pe.name;
cout<<"性别:"<<p->pe.sex;
cout<<"民族:"<<p->pe.MZ;
cout<<"国籍:"<<p->pe.GJ;
cout<<"学历:"<<p->pe.XL;
cout<<"出生日期:"<<p->birthday;
cout<<"家庭住址:"<<p->address;
void List::dispscore(nodetype* p)
cout<<"学号:"<<p->sc.num;
cout<<"语文成绩:"<<p->sc.chinese;
cout<<"英语成绩:"<<p->sc.english;
cout<<"数学成绩:"<<p->sc.math;
cout<<"物理成绩:"<<p->sc.physics;
void List::disptelephone(nodetype* p)
cout<<"手机号码是:"<<p->te.SJ;
cout<<"家庭电话是:"<<p->te.JD;
cout<<"学校电话是:"<<p->te.XD;
cout<<"*********************************************************"<<endl;
cout<<"1:编辑个人信息"<<endl;
cout<<"2:编辑学科成绩"<<endl;
cout<<"3:编辑联系方式"<<endl;
cout<<"4:显示个人信息"<<endl;
cout<<"5:显示学科成绩"<<endl;
cout<<"6:显示联系方式"<<endl;
cout<<"7:显示该学生所有信息"<<endl;
cout<<"8:帮助菜单"<<endl;
cout<<"9:返回上一级菜单"<<endl;
cout<<"*********************************************************"<<endl;
cout<<"****************************学生管理系统**************************"<<endl;
cout<<"1:添加一个学生信息"<<endl;
cout<<"2:删除一个学生信息"<<endl;
cout<<"3:显示所有学生的姓名"<<endl;
cout<<"4:根据姓名显示单个学生所有信息"<<endl;
cout<<"5:根据姓名对单个学生进行编辑"<<endl;
cout<<"6:帮助菜单"<<endl;
cout<<"7:保存数据"<<endl;
cout<<"0:退出系统"<<endl;
cout<<"********************************************************************"<<endl;
p=L1.load();//初始化:从外部读入数据创建链表
cout<<"请输入选择(帮助选项--> 6):"<<endl;
cout<<"**************添加一个学生信息******************"<<endl;
cout<<"下面输入个人信息:"<<endl;
cout<<"下面输入学科成绩:"<<endl;
cout<<"下面输入联系方式:"<<endl;
cout<<"**************删除一个学生信息******************"<<endl;
cout<<"请输入学生姓名:"<<endl;
cout<<"**************显示所有学生姓名******************"<<endl;
cout<<"**************根据姓名显示单个学生所有信息******************"<<endl;
cout<<"请输入学生姓名:"<<endl;
if(L1.check(ch,"7"))//保存数据
if((fp=fopen("student.txt","w"))==NULL)
cout<<"打开文件失败"<<endl;
//将 L1.listlen()赋予字符串中的数字
sprintf(t,"The Length Of Link:%d\n", L1.listlen());
p=L1.findnode(1);//将链表头指针赋予 p
for(i=0; i<L1.listlen(); i++)
fputs(p->address, fp);//输出地址
fputs(p->birthday, fp);//输出生日
fputs(p->sc.num, fp);//输出学号
fputs(p->sc.chinese, fp);//输出语文成绩
fputs(p->sc.english, fp);//输出英语成绩
fputs(p->sc.math, fp);//输出数学成绩
fputs(p->sc.physics, fp);//输出物理成绩
fputs(p->pe.name, fp);//输出姓名
fputs(p->pe.sex, fp);//输出性别
fputs(p->pe.GJ, fp);//输出国籍
fputs(p->pe.MZ, fp);//输出民族
fputs(p->pe.XL, fp);//输出学历
fputs(p->te.SJ, fp);//输出手机
fputs(p->te.JD, fp);//输出家庭电话
fputs(p->te.XD, fp);//输出学校电话
cout<<"**************根据姓名对单个学生进行编辑******************"<<endl;
cout<<"请输入学生姓名:"<<endl;
cout<<"*********************************************************"<<endl;
cout<<"1:编辑个人信息"<<endl;
cout<<"2:编辑学科成绩"<<endl;
cout<<"3:编辑联系方式"<<endl;
cout<<"4:显示个人信息"<<endl;
cout<<"5:显示学科成绩"<<endl;
cout<<"6:显示联系方式"<<endl;
cout<<"7:显示该学生所有信息"<<endl;
cout<<"8:帮助菜单"<<endl;
cout<<"9:返回上一级菜单"<<endl;
cout<<"*********************************************************"<<endl;
cout<<"请输入选择(帮助选项--> 8):"<<endl;
cout<<"**************编辑个人信息******************"<<endl;
cout<<"**************编辑学科成绩******************"<<endl;
cout<<"**************编辑联系方式******************"<<endl;
cout<<"**************显示个人信息******************"<<endl;
cout<<"**************显示学科成绩******************"<<endl;
cout<<"**************显示联系方式******************"<<endl;
break;//用 break跳出本循环,不要用 return,return是退出程序
三、初学者请教 两道简单的c语言编程题目
1、difftime(time_t time1, time_t time0)/ 86400
2、这样做得缺点是,这里的time_t类型,只支持到2037年
3、楼主用的方法,在实际编程里不常用,变化比较大。
4、下面这个方法是直接计算两个日期到公元元年的天数
5、然后相减,这个是实际编程时的算法,经过很多程序员的洗炼,已经被广泛使用
6、#define LEAP(y)(y%(y%100?4:400)==0)/*公元y年是否闰年*/
7、long totaldays(int year,int month,int day)/*公元纪年的总天数*/
8、{ int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
9、 for(m=1;m<month;m++)c+=days[m];
10、 return c+y/4-y/100+y/400+y*365L;
11、 scanf("%d%*c%d%*c%d",&y,&m,&d);
12、 scanf("%d%*c%d%*c%d",&y,&m,&d);
13、 printf("total days:%ld\n",t2-t1);
14、尤其是刻意追求短代码就更没有必要了