今天下午面了百度,其中两题是这样的,我都没有回答出来。
概率题:一个篮子里装着20个红球和20个蓝球,每次从中取出2球,如果取出的2球颜色是不一样的,那么放回红球,取出蓝球;如果取出的2球的颜色是一样的,则都不放回,将2球都取出;不断重复以上步骤。问题:求最后一次取球恰好只取到一个红球的概率。
算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。(直接枚举的话应该是O(n^2))。我的解法如下,是直接枚举的。
1 /* 百度面试题 */
2 #include <math.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #define N (20000)
6 #define M (N/2)
7
8 static int primes[M]; /*编译器初始化了0*/
9 static int sums[M*M]; /*任意两素数之和*/
10 int my_cmp (const void * a, const void * b);
11
12 /* 判断一个数是不是素数,是素数则返回它自己;否则返回0 */
13 int is_prime (int x){
14 int i,t;
15 int ans = 0;
16 if (x<=1 || 0==x%2){
17 return ans;
18 }
19 t = (int)sqrt (x);
20 for (i=3;i<=t;i+=2){
21 if (0 == x%i){
22 return ans;
23 }
24 }
25 return (ans = x);
26 }
27
28 /* 保存区间的素数到全局数组primes */
29 void primes_in (int low, int high){
30 int i=0,j=low;
31 while (j<=high){
32 if (is_prime (j)){
33 primes[i++]=j;
34 }
35 j++;
36 }
37 }/*数组中的非零元素就是区间中的素数 */
38
39 /*求区间中素数的和并打印出来 */
40 void solve (int left, int right){
41 int i,j,k;
42 int t;
43 primes_in (left,right);
44 for (t=0; t<M; t++){
45 if (!primes[t]){
46 break;
47 }
48 }
49 for (k=0,i=0; i<t; i++){
50 for (j=i; j<t; j++){
51 sums[k++]=primes[i]+primes[j];
52 }
53 }
54 /*排序*/
55 qsort (sums, k, sizeof (int), my_cmp);
56 /*去重*/
57 i=0;
58 for (j=i+1; j<k; j++){
59 if (sums[j] > sums[i]){
60 sums[++i] = sums[j];
61 }
62 }
63 /*打印*/
64 for (j=0;j<=i;j++){
65 printf ("%d, %d\n", j+1, sums[j]);
66 }
67 }
68
69 int my_cmp (const void * a, const void * b){
70 return (*(int *)a - *(int *)b);
71 }
72
73
74 /* 程序入口 */
75 int main (){
76 solve (6,N);
77 return 0;
78
79 }