C语言高手进 概率问题

2025-01-05 15:12:58
推荐回答(3个)
回答1:

#include
#include
#include
// 精确地分钟的时间类
// 采用24小时制
struct Time
{
int hour;
int min;
};
//长途车早6:00开始发车
const Time BusStartTime = {6,0};
//长途车晚6:00结束发车
const Time BusEndTime = {18,0};
// 发车间隔为1小时
const Time BusIntervalTime = {1,0};
// 长途车正常到站时间 40分钟
const Time BusNormalArriveTime = {0,40};
// 长途车晚点到站的最小最大时间范围
// 最少延迟 0 分钟
const Time BusDelayArriveMinTime = {0,0};
// 最大延迟 40 分钟
const Time BusDelayArriveMaxTime = {0,40};

// 旅客到站等车的时间区间
// 旅客到站等车的最早时间
const Time PassengerWaitEarliestTime = {10,0};
// 旅客到站等车的最晚时间
const Time PassengerWaitLastestTime = {10,30};

// 模拟旅客等车次数
const int SimulateTimes = 5;

/*
比较两个时间 t1 和 t2 的早晚
t1 比 t2 早,返回负数
t1 比 t2 晚,返回正数
t1 和 t2 同时,返回0
*/
int compareTime(struct Time t1,struct Time t2)
{
return (t1.hour * 60 + t1.min) - (t2.hour * 60 + t2.min);
}

/*
在 t1 的基础上加上 t2
结果不会超出24小时制
*/
Time addTime(struct Time t1,struct Time t2)
{
Time result ;
result.min = (t1.min + t2.min)%60;
result.hour = ((t1.hour + t2.hour) + (t1.min + t2.min)/60)%24;

return result;
}

/*
在 t1 的基础上加上 t2
结果转换成分钟 (小时为0)
*/
Time addTime2(struct Time t1,struct Time t2)
{
Time result ;
result.hour = 0;
result.min = (t1.hour*60 + t1.min) + (t2.hour*60 + t2.min);
return result;
}

/*
在 t1 的基础上减去 t2
结果转换成分钟(小时为0)
*/
Time subTime2 (struct Time t1,struct Time t2)
{
Time result ;
result.hour = 0;
result.min = (t1.hour*60 + t1.min) - (t2.hour*60 + t2.min);
return result;
}
/*
产生介于 tMin 和 tMsx 之间的一个随机时间
*/
Time randTime(struct Time tMin,struct Time tMax)
{
Time result ;

int tMinAsMinute = tMin.hour*60 + tMin.min;
int tMaxAsMinute = tMax.hour*60 + tMax.min;
int randTAsMinute = rand()%(tMaxAsMinute - tMinAsMinute ) + tMinAsMinute;

result.hour = randTAsMinute/60;
result.min = randTAsMinute%60;
return result;
}

/*
时间 t 和 n 取平均
*/
int averageTime(struct Time t,int n)
{
return (t.hour*60 +t.min) / n;
}

/*
输出时间 t
*/
void printTime(struct Time t)
{
printf(" [%2d : %2d] ",t.hour,t.min);
}

int main(int argc, char *argv[])
{
Time busStartTime;

Time busNormalArriveTime;
Time randDelayTime;
Time busRealArriveTime;

Time passengerWaitStartTime;
Time passengerMinWaitTime;
Time passengerGetOnBus ;
Time passengerTotalWaitTime = {0,0};

int t ;
// 模拟次数
for(t = 0 ; t < SimulateTimes ; t ++)
{
srand(time(NULL)+t);
// 输出当前模拟第几天
printf("SimulateDay = %6d\n",t + 1);
// 乘客当天到站等车的开始时间
passengerWaitStartTime = randTime(PassengerWaitEarliestTime,PassengerWaitLastestTime);
// 输出乘客当天到站等车的开始时间
printf("passengerWaitStartTime = ");
printTime(passengerWaitStartTime);
printf("\n");

// 乘客当天能等车花费的时间,初始化为一个最大值(24小时)
passengerMinWaitTime.hour = 24;
passengerMinWaitTime.min = 59;

// 模拟一天的发车过程
for( busStartTime = BusStartTime ;
compareTime(busStartTime,BusEndTime)<=0 ;
busStartTime = addTime(busStartTime,BusIntervalTime)
)
{
// 当前 busStartTime 出发的公交车,正常到站时间
busNormalArriveTime = addTime(busStartTime,BusNormalArriveTime);
// 当前 busStartTime 出发的公交车,随机的延迟时间
randDelayTime = randTime(BusDelayArriveMinTime,BusDelayArriveMaxTime);
// 当前 busStartTime 出发的公交车,真实的到站时间
busRealArriveTime = addTime(busNormalArriveTime,randDelayTime);

// 输出公交车信息
printf("busStartTime = "); printTime(busStartTime);
printf(";busNormalArriveTime = "); printTime(busNormalArriveTime);
printf(";randDelayTime = ");printTime(randDelayTime);
printf(";busRealArriveTime = ");printTime(busRealArriveTime);
printf("\n");

/*
当前 busStartTime 出发的公交车,真实的到站时间和
乘客的真实等车时间相交
并且小于当前等到车的时间点
*/

// 比较乘客能否等到这辆车,以及是否最早的班车
if(
compareTime(busRealArriveTime,passengerWaitStartTime) >= 0 &&
compareTime(subTime2(busRealArriveTime,passengerWaitStartTime),passengerMinWaitTime) <= 0
)
{
passengerMinWaitTime = subTime2(busRealArriveTime,passengerWaitStartTime);
passengerGetOnBus = busRealArriveTime;
}
}

// 输出乘车上车信息
printf("passenger get on bus at :");printTime(passengerGetOnBus);
printf("passenger wait :");printTime(passengerMinWaitTime);
printf("\n\n");
passengerTotalWaitTime = addTime2(passengerTotalWaitTime,passengerMinWaitTime);
}
// 求平均值
printf("avarage min = %d\n",averageTime(passengerTotalWaitTime,SimulateTimes));

return 0;
}

回答2:

用数学公式啊、、楼主
高中学的线性规划可以解决

回答3:

第一个月2只(题中是给定的一对)
程序如下:
#include "stdio.h"
main()
{
long f1,f2;
int i;
f1=f2=1;
for(i=1;i<=20;i++)
{ printf("%12ld %12ld",f1,f2);
if(i%2==0) printf("\n");/*控制输出,每行四个*/
f1=f1+f2; /*前两个月加起来赋值给第三个月*/
f2=f1+f2; /*前两个月加起来赋值给第三个月*/
}
}

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

斐波那契数列

斐波那契①是中世纪占主导地位的数学家之一,他在算术、代数和几何等方面多有贡献.他生于比萨的列奥纳多家族(1175—1250),是一位意大利海关设在南部非洲布吉亚的官员的儿子.由于他父亲的工作,使他得以游历了东方和阿拉伯的许多城市.而在这些地区,斐波那契熟练地掌握了印度—阿拉伯的十进制系统,该系统具有位置值并使用了零的符号.在那时,意大利仍然使用罗马数字进行计算.斐波那契看到了这种美丽的印度—阿拉伯数字的价值,并积极地提倡使用它们.公元1202年,他写了《算盘书》一书,这是一本广博的工具书,其中说明了怎样应用印度—阿拉伯数字,以及如何用它们进行加、减、乘、除计算和解题,此外还对代数和几何进行了进一步的探讨.意大利商人起初不愿意改变老的习惯,后来通过对阿拉伯数字不断地接触,加上斐波那契和其他数学家的工作,终使印度—阿拉伯数字系统得以在欧洲推广,并被缓慢地接受.

斐波那契数列——1,1,2,3,5,8,13,21,34,…

具有讽刺意味的是:斐波那契在今天的著名,是缘于一个数列.而这个数列则来自他的《算盘书》中一道并不出名的问题.他当时写这道题只是考虑作为一个智力练习.然而,到了19世纪,法国数学家E·卢卡斯出版了一部四卷本的有关娱乐数学方面的著作时,才把斐波那契的名字,加到该问题的解答和所出现的数列上去.

《算盘书》中引致斐波那契数列的问题是:

1)假定一个月大小的一对兔子(雄和雌的),对于繁殖还太年轻,但两个月大小的兔子便足够成熟.又假定从第二个月开始,每一个月它们都繁殖一对新的兔子(雄和雌的).

2)如果每一对兔子的繁殖都按上面说的同样的方式.试问,从开始起每个月有多少对兔子呢?

免子的对数

斐波那契数列的每一项,都等于它前两项的和.用公式表示为:

Fn=Fn-1+Fn-2.

那时,斐波那契并没有去研究这种数列的结果,从而他没有给出任何真正有意义的东西.一直到19世纪,当数学家们开始对这个数列感兴趣时,它的性质和它所触及的领域,才开始显现出来.

斐波那契数列出现在:

1)帕斯卡三角形,二项展开式和概率.

2)黄金比值突平鹁匦危?

3)自然和植物.

4)使人感兴趣的数学戏法.

5)数学恒等式
来源: