百度面试题

今天下午面了百度,其中两题是这样的,我都没有回答出来。
概率题:一个篮子里装着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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值