2012 年 9 月 24 日 Google 校园招聘笔试试题
代码:
[cpp] view plaincopyprint?
1. //转载请标明出处,原文地址:
http://blog.csdn.net/hackbuteer1/article/details/8017703
2. bool IsPrime(int n)
3. {
int i;
if(n < 2)
return false;
else if(2 == n)
return true;
if((n&1) == 0)
//n%2 == 0
return false;
for(i = 3 ; i*i <= n ; i += 2)
//只考虑奇数
{
}
if(n % i == 0)
return false;
return true;
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. }
18.
19. /*
20. 考虑到所有大于 4 的质数,被 6 除的余数只能是 1 或者 5
21. 比如接下来的 5,7,11,13,17,19 都满足
22.
23. 所以,我们可以特殊化先判断 2 和 3
24. 但后面的问题就出现了,因为并非简单的递增,从 5 开始是+2,+4,+2,+4,....这样递增的
25. 这样的话,循环应该怎么写呢?
26.
27. 首先,我们定义一个步长变量 step,循环大概是这样 for (i = 5; i <= s; i += step)
28. 那么,就是每次循环,让 step 从 2 变 4,或者从 4 变 2
29. 于是,可以这么写:
30. */
31. bool IsPrime2(int n)
32. {
int i, step = 4;
if(n < 2)
return false;
else if(2 == n || 3 == n)
return true;
if((n&1) == 0)
//n%2 == 0
return false;
if(n%3 == 0)
//n%3 == 0
return false;
for(i = 5 ; i*i <= n ; i += step)
{
}
if(n % i == 0)
return false;
step ^= 6;
return true;
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49. }
50.
51. void print_prime(int n)
52. {
53.
54.
55.
56.
57.
58.
int i , num = 0;
for(i = 0 ; ; ++i)
{
if(IsPrime2(i))
{
printf("%d
" , i);
++num;
if(num == n)
break;
}
}
printf("\n");
59.
60.
61.
62.
63.
64.
65.
66. }
代码:
[cpp] view plaincopyprint?
1. //转载请标明出处,原文地址:
http://blog.csdn.net/hackbuteer1/article/details/8017703
2. void myswap(int a , int b , int* array)
int temp = array[a];
array[a] = array[b];
array[b] = temp;
3. {
4.
5.
6.
7. }
8.
9. //利用 0 和其它数交换位置进行排序
10. void swap_sort(int* array , int len)
11. {
12.
13.
int i , j;
for(i = 0 ; i < len ; ++i)
//因为只能交换 0 和其他数,所以先把 0
找出来
14.
{