您当前的位置:首页 > 互联网教程

求助:用c语言编写班级中两个人生日概率相同问题

发布时间:2025-05-14 10:55:54    发布人:远客网络

求助:用c语言编写班级中两个人生日概率相同问题

一、求助:用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、尤其是刻意追求短代码就更没有必要了



相关内容FAQs: