2012-2-25面试题目

1.五只猴子分桃。半夜,第一只猴子先起来,它把桃分成了相等的五堆,多出一只。于是,它吃掉了一个,拿走了一堆; 第二只猴子起来一看,只有四堆桃。于是把四堆合在一起,分成相等的五堆,又多出一个。于是,它也吃掉了一个,拿走了一堆;…..其他几只猴子也都是 这样分的。问:这堆桃至少有多少个?

解:

参考答案:先给这堆桃子加上4个,设此时共有X个桃子,最后剩下a个桃子.这样: 第一只猴子分完后还剩:(1-1/5)X=(4/5)X; 第二只猴子分完后还剩:(1-1/5)2X; 第三只猴子分完后还剩:(1-1/5)3X; 第四只猴子分完后还剩:(1-1/5)4X; 第五只猴子分完后还剩:(1-1/5)5X=(1024/3125)X; 得:a=(1024/3125)X; 要使a为整数,X最小取3125. 减去加上的4个,所以,这堆桃子最少有3121个。

2.已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。

(这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.)

根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是: 1.rand7执行两次,出来的数为a1.a2.
2.如果a1*7+a2<40,b=(a1*7+a2)/4+1,如果a1*7*a2>=40,重复第一步)。参考代码如下所示:

int rand7()  
{  
  return rand()%7+1;  
}  
  
int rand10()  
{  
  int a71,a72,a10;  
  do   
  {  
    a71= rand7()-1;  
    a72 = rand7()-1;  
    a10 = a71 *7 + a72;  
  } while (a10>= 40);  
  return (a71*7+a72)/4+1;  
}