理想随机数发生器【解】--英雄会

来源:互联网 发布:c语言菱形编程图形程序 编辑:程序博客网 时间:2024/06/06 05:53

一个理想随机数发生器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" 

 

说起来也是巧,见到的第一题就是理想随机数发生器,感觉应该不难。

提笔做了,测试也是差不多了,于是提交了,果断错了...首先是正整数x,这个干扰我了,所以我的题目看错了,R(x)产生的是0-x之间的实数,而我,想当然的认为是整数了,然后煞有其事的做了...

发现错误之后,就重新做了一次,交了,还是错的...这个原因我没发现,猜测是输出结果的问题,我全局定义了一个字符串,最后返回输出的...很遗憾,没过

 

昨天看到一个任意类型的转换为string,试了一下,终于成了,说多了都是泪啊...

<这个值得学习>

std::stringstream>

 

闲话扯多了,说说这道题吧,看清楚题目之后,这应该是一道概率论题目,这个对大家都不是难事吧,贴一张word里面画的小图

其中矩形面积即是a*b,阴影面积是满足条件的值R(a) + R(b) <= c;我们需要计算的是阴影面积。(这个对大家聪明的头脑不是问题吧,if(exit)  请留言)

嗯,就是这样,o(∩_∩)o 哈哈

代码附上:

#include <cstdio>#include <iostream>#include <cstring>#include <cstdlib>#include <sstream>using namespace std;class Test {public:    static int HighestCommon(int m,int n)    {        int temp;        while(m)        {            temp = m;            m = n % m;            n = temp;        }        return n;    }    static string calculate (int   a,int   b,int   c)    {        if (a + b <= c)        {            return "1/1";        }        int demo;  //分母        int count;  //分子        int ia;  //最大公约        int tri1, tri2;        tri1 = c - b > 0 ? c - b : 0;  //若c < b,超过面积部分        tri2 = c - a > 0 ? c - a : 0;  //同理        count = c * c - tri1 * tri1 - tri2 * tri2;  //阴影面积        demo = 2 * a * b;  //分子分母同乘2        ia = HighestCommon(count, demo);        count /= ia;        demo /= ia;        std::stringstream ss;        ss<<count<<"/"<<demo;        std::string ret=ss.str();        return ret;    }};//start 提示:自动阅卷起始唯一标识,请勿删除或增加。int main(){    cout<<Test::calculate(1,5,4)<<endl;    system("pause");}//end //提示:自动阅卷结束唯一标识,请勿删除或增加。


 

结果:

 

if(有哪位仁兄c语言通过了英雄会的测试)

   记得告诉我啊,o(∩_∩)o ,3Q

 

浅思简言,各位大牛多多指点,3Q啦

 

2 0
原创粉丝点击