请问这道题这样做哪儿不对了?实在没想明白,算法的逻辑哪儿错了 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));
} 展开
一个理想随机数发生器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));
} 展开
1个回答
展开全部
先别着急写程序,先搞清楚数学。这个问题的答案是可以用代数方法精确解决的,只不过解析式是分段函数。要写程序,也只是把这个分段函数实现了,好计算函数值。不是让你用模拟方法算概率的!!
在坐标平面上,左下角是(0,0),右上角是(a,b)的矩形,被x+y=c的右斜直线分割,斜线下的矩形部分的面积,比矩形总面积,就是所求的概率。只是有些情况下,斜线和矩形根本不相交,这对应概率为0和概率为1两种极端情况。在相交的情况下,也分斜线和短边1相交,短边2相交,短边不相交三种情况,所以是5分段函数。
你的程序我没仔细看,但是看见你的双重循环,++count,我就知道你走邪路了。
在坐标平面上,左下角是(0,0),右上角是(a,b)的矩形,被x+y=c的右斜直线分割,斜线下的矩形部分的面积,比矩形总面积,就是所求的概率。只是有些情况下,斜线和矩形根本不相交,这对应概率为0和概率为1两种极端情况。在相交的情况下,也分斜线和短边1相交,短边2相交,短边不相交三种情况,所以是5分段函数。
你的程序我没仔细看,但是看见你的双重循环,++count,我就知道你走邪路了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询