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