请问这道题这样做哪儿不对了?实在没想明白,算法的逻辑哪儿错了 80

题目详情一个理想随机数发生器R,给定参数正整数x,它可以均匀随机产生一个闭区间[0,x]之间的实数(注意是实数,每个实数出现的概率相同)R(x)。现在给定3个正整数a,b... 题目详情

一个理想随机数发生器R,给定参数正整数x,它可以均匀随机产生一个闭区间[0,x]之间的实数(注意是实数,每个实数出现的概率相同)R(x)。现在给定3个正整数a,b,c,我们使用a,b产生两个随机实数R(a), R(b),问R(a) + R(b) <= c的概率有多大?

输入: 正整数a,b,c。正整数均不超过10000

输出: R(a) + R(b) <= c的概率。注意输出是一个有理数(分数),请化为最简分数。(分子分母的最大公约数是1)。

例如 输入a = 1, b = 1, c = 4,输出"1/1"

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
int maxgys(int x,int y){
int t;
if (x<y)
{
x=x+y;
y=x-y,x=x-y;
}
while((t=x%y)!=0){
x=y;y=t;
}
return y;
}
int getmin(int x,int y){
if(x>y) return y;
else return x;
}
char* calculate (int a,int b,int c)
{
int count=0,max=(a+1)*(b+1),i,j,gys;
int fenzi,fenmu;
static char str[100],cfenzi[50],cfenmu[50];
if(a+b<c) return "1/1";
for(i=0;i<=getmin(a,c);i++){
for(j=0;j<=getmin(b,c-i);j++){
if(i+j<=c) ++count;
}
}
gys=maxgys(count,max);
fenzi=count / gys,fenmu=max / gys;
// printf("%d",count);
itoa(fenzi,cfenzi,10);
itoa(fenmu,cfenmu,10);
for(i=0;i<strlen(cfenzi);i++){
str[i]=cfenzi[i];
}
str[i++]='/';
for(j=0;j<strlen(cfenmu);j++){
str[i++]=cfenmu[j];
}
str[i]=0;
//printf("%s",str);
return str;
}

int main()
{
printf("%s",calculate(0,19,10));
}
展开
 我来答
uv1920
2013-11-27 · TA获得超过267个赞
知道答主
回答量:137
采纳率:100%
帮助的人:82.5万
展开全部
先别着急写程序,先搞清楚数学。这个问题的答案是可以用代数方法精确解决的,只不过解析式是分段函数。要写程序,也只是把这个分段函数实现了,好计算函数值。不是让你用模拟方法算概率的!!

在坐标平面上,左下角是(0,0),右上角是(a,b)的矩形,被x+y=c的右斜直线分割,斜线下的矩形部分的面积,比矩形总面积,就是所求的概率。只是有些情况下,斜线和矩形根本不相交,这对应概率为0和概率为1两种极端情况。在相交的情况下,也分斜线和短边1相交,短边2相交,短边不相交三种情况,所以是5分段函数。
你的程序我没仔细看,但是看见你的双重循环,++count,我就知道你走邪路了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式