现在的位置: 首页 > 综合 > 正文

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

2014年01月29日 ⁄ 综合 ⁄ 共 1391字 ⁄ 字号 评论关闭

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

 

抱歉!评论已关闭.