发两道笔试题目,想看看大家的做法

wxdcxp 2010-02-28 10:46:29
1.1 编程题目:
------------------------------
一个袋子装着围棋,有m个黑棋,n个白棋
每次随机同时取两个,如果是两个黑棋,就不用放回
如果是两个白棋,就放回一个黑棋
如果是一个黑棋一个白棋,就放回一个白棋
问最后仅剩下的是黑棋的概率为?
输入:
多组测试数据,每组一行
每行为m与n (1 <= m,n <= 1e9),
直到EOF
输出:
输出概率值,精确到小数位后三位
样例输入:
1 1
1 2
样例输出:
0.000
1.000
------------------------------
1.2 编程要求:
编程语言:GCC
题二(应用编程题):
2.1 功能需求:
编写两个程序,一个运行在LINUX下的服务端程序(S),负责接收数据;另一个运行在WIN下和客户端程序(C),负责发送数据。其两个程序的具体功能如下:
S、服务端程式:
S.1、使用SOCKET协议接收C发送上来的数据(数据包格式为:HH:mm:ss);
S.2、记录详细的接收数据;
S.3、当MM=nn时,日志的该行记录前加“***”三个*号,同时使用UDP协议向C发送数据(数据包格式为:[i]:***HH:mm:ss)。
C、客户端程式:
C.1、WINFORM界面程式序,相应的控件有,开始、结束、文本框等;
C.2、每隔1秒向S发送数据包(数据包格式为:HH:mm:ss);
C.3、接收S发送的UDP数据,并显示将接收到的数据;
...全文
307 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilyyyfn 2010-03-09
  • 打赏
  • 举报
回复
我觉得最终的结果只可能是0或1
Sephoenix 2010-03-03
  • 打赏
  • 举报
回复
引用 16 楼 wxdcxp 的回复:
C/C++ code/*********************************************************************************
get == 1 //随机取到的是两个黑棋
get == 2 //随机取到的是两个白棋


get = rand() % 3 + 1;

这样做,就是默认每次三种情况出现的概率都是1/3了,呃。。。
wxdcxp 2010-03-02
  • 打赏
  • 举报
回复

/*********************************************************************************
get == 1 //随机取到的是两个黑棋
get == 2 //随机取到的是两个白棋
get == 3 //随机取到的是一个白棋,一个黑棋
Black_Num //初始时袋子中黑棋的个数
White_Num //初始时袋子中白棋的个数
Black //袋子中最后剩下的是黑棋,出现的次数
White //袋子中最后剩下的是白棋,出现的次数
Empty //袋子中最后一个棋都没有剩下
BlackPercent //最后剩下的是黑棋的概率 BlackPercent = Black/(White + Zero + Black)
COUNTTIMES //采取计算100000次
编译环境 gcc version 3.4.4 vim version 7.2
************************************************************************************/

#include <iostream>
#include <iomanip>
#define TRUE 1
#define FALSE 0
#define OK 0
#define COUNTTIMES 100000
typedef float status;
int Count(void);
status Black_Num, Black_Num_Temp, White_Num, White_Num_Temp, Black = 0, Empty = 0, White = 0;
int get, start = TRUE;
using namespace std;
int Count(void)
{
if ( Black_Num == 1&&White_Num == 0 ) /*最后袋子中只剩下一个黑棋*/
{
Black++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
else if ( White_Num == 1&&Black_Num == 0 ) /*最后袋子中只剩下一个白棋*/
{
White++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
else if ( Black_Num == 0&&White_Num == 0 ) /*最后袋子中没有剩棋*/
{

Empty++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
return OK;
}


int main(void)
{

int i;
float BlackPercent = 0.000;
cout << "请输入袋子中白棋个数与黑棋个数中间用空格分开" << endl;
cin >> Black_Num >> White_Num;
Black_Num_Temp = Black_Num;
White_Num_Temp = White_Num;
srand(time(0)); /*初始化随机种子*/
for ( i = 0; i < COUNTTIMES; i++)
{
start = TRUE;
while(start)
{

get = rand() % 3 + 1;
switch( get )
{
case 1:
if ( Black_Num >= 2 )
{
Black_Num = Black_Num - 2; /* 取到两个黑棋,黑棋的个数少2 */
Count();

}
break;
case 2:
if ( White_Num >= 2 )
{
Black_Num = Black_Num + 1; /* 取到两个白棋,白棋个数少2,黑棋个数多1*/
White_Num = White_Num - 2;
Count();
}
break;
case 3:
if ( White_Num >= 1&&Black_Num >= 1 )
{
Black_Num = Black_Num - 1; /* 取到一个黑棋,一个白棋,白棋个数不变,黑棋个数少1 */
Count();
}
break;
default:
break;
}
}
}
BlackPercent = Black/(Black + White + Empty);
cout << showpoint << fixed << setprecision(3); //设置输出的格式保留小数点后三位
cout << "最后剩下的是黑棋出现的次数 = " << Black << endl;
cout << "最后剩下的是白棋出现的次数 = " << White << endl;
cout << "最后一个都不剩出现的次数 = " << Empty << endl;
cout << "最后剩下黑棋的概率 = " << BlackPercent << endl;

return OK;
}





ithiker 2010-03-01
  • 打赏
  • 举报
回复
“如果是两个白棋,就放回一个黑棋”
如果是第一次就取到两个白的,此时手头没黑的,仍是假设放回一个黑的,使黑棋变为m+1个?
wxdcxp 2010-03-01
  • 打赏
  • 举报
回复
引用 4 楼 cattycat 的回复:
这种作业贴没人愿意花时间来写。谁那么闲啊。


这不是作业贴,是笔试题目。我觉得挺有难度的,至少目前还没想到好的算法
nobody@noone 2010-03-01
  • 打赏
  • 举报
回复
这东西实现要么就是穷举,要么就是整个算法,不过算法没时间分析

tan870426 2010-03-01
  • 打赏
  • 举报
回复
帮顶下~!
cattycat 2010-03-01
  • 打赏
  • 举报
回复
这种作业贴没人愿意花时间来写。谁那么闲啊。
wxdcxp 2010-03-01
  • 打赏
  • 举报
回复
是不是题目挺有难度的,都没有人回答?
wxdcxp 2010-03-01
  • 打赏
  • 举报
回复
引用 1 楼 gigglesun 的回复:
“如果是两个白棋,就放回一个黑棋”
如果是第一次就取到两个白的,此时手头没黑的,仍是假设放回一个黑的,使黑棋变为m+1个?


按题目的意思是如果第一次就取到两个白的,黑棋的数是m+1
例如袋子里有两个白的,一个黑的
如果第一次就取到两白的,那么黑棋的数目就是2

所以会得出:

样例输入:
1 1
1 2
样例输出:
0.000
1.000

ZOthello 2010-03-01
  • 打赏
  • 举报
回复
这是一个马尔科夫链吧,随即过程里面的~~
forster 2010-03-01
  • 打赏
  • 举报
回复
证明还有点意义。。。
Sephoenix 2010-03-01
  • 打赏
  • 举报
回复
第一个,用c++写了个很挫的代码。。。。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

bool play(int m, int n);
void main( void )
{
while(true)
{
int m;
printf("input m: ");
scanf("%d",&m);
int n;
printf("input n: ");
scanf("%d",&n);
double success = 0;
const double TESTNUMBER = 10000000;
for(int i = 0; i<TESTNUMBER; i++)
{
if( play(m, n))
success++;
}
printf("%f times is ok in %f times \n", success, TESTNUMBER);
double probability = (double)(success / TESTNUMBER);
printf("probability is : %f\n", probability);
}
}

bool play(int m, int n)
{
srand(time(NULL));
const int M = m;
const int N = n;
while( m + n >= 2 )
{
int i = rand() % (m + n) + 1;
int j = rand() % (m + n) + 1;
while( i == j)
{
j = rand() %(m + n) + 1;
}
if(i <= m && j <= m) //两个黑棋
{
m = m - 2;
}
else if(i >m && j >m) // 两个白棋
{
n = n - 2;
if(m < M)
m = m + 1;
}
else
{
m = m - 1;
}
}
if(m == 1)
{
return true;
}
return false;
}
dubiousway 2010-03-01
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

bool WhiteBlack(int m, int n){
if(rand()%(m+n)<m) return 1; //black
else return 0;//white
}

void main(){
srand(time(NULL));

int m0=1,n0,
remnant=0;

do{
remnant=0;
scanf("%d %d",&m0,&n0);
if(m0==0) break;

for(int k=0;k<1000;k++){
int m=m0,n=n0,// 20 white; 10 black
x1,x2;//x1: first lot, x2: second lot

while((m+n)>=2){
x1= WhiteBlack(m,n);
if(x1) m--;
else n--;
x2= WhiteBlack(m,n);
if(x2) m--;
else n--;

if(x1==0 && x2==0) m++;
else if(!(x1&&x2)) n++;
}
if(m==1) remnant++;

}
printf("Probability: %.3f\n",remnant/1000.0);
}while(1);
}


Sephoenix 2010-03-01
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
wxdcxp 2010-03-01
  • 打赏
  • 举报
回复
引用 9 楼 dubiousway 的回复:
取到什么时候算结束?

如果一开始 有 m=1,n=2

第一次 :2白 ,则放回1黑,此时:剩下2黑

第2次还取不取。这算不算剩下黑棋?
如果第2次还取,那么最后就是一个棋也不剩了。这是不是也算一种结果情况

yes
dubiousway 2010-03-01
  • 打赏
  • 举报
回复
取到什么时候算结束?

如果一开始 有 m=1,n=2

第一次 :2白 ,则放回1黑,此时:剩下2黑

第2次还取不取。这算不算剩下黑棋?
如果第2次还取,那么最后就是一个棋也不剩了。这是不是也算一种结果情况
dubiousway 2010-03-01
  • 打赏
  • 举报
回复
如果第一次抓出两个白棋,怎么算?(我的意思是怎么放回1个黑棋)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧