n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 230. 有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。 231.
232. 输入:电灯的数量 233. 输出:亮着的电灯数量 234. 样例输入:3 235. 样例输出:1 236.
237. 解题思路1:这道题,如果要模拟的话,当然是可以的,但对于代码基础较差的同学写起来就比较吃力了,在这里写模拟的做法
238. 解题思路2:在这道题上面多思考思考,可以看出,对于任何一个灯来说,比如12,其因数有1,2,3,4,6,12。说明,编号为1,2,3,4,6,12的学生分别要拉它一下,在这里发现,1*12=12,2*6=12,3*4=12,所以其因数都是一一对应的,也就是,1拉的那一下被12抵消了,2拉的那一下被6抵消了,那么谁不会被抵消呢?答案是平方数,比如9的因数是1,3,9,那么3*3=9,而3只拉一次,所以不会被抵消。因此,这道题的答案就是,输入的n以内的平方数个数,等于(int)sqrt(n)。
239. 从这道题可以看出,编程的很多时候,多思考比多动笔要有用的多。 240.
241. */
242. #include
248. cin>>n;
249. memset(vis,0,sizeof(vis)); //这句话的意思是把vis数组清0,0表示此刻灯是关着的,1表示是开着的
250. for (int i=1;i<=n;i++) //枚举每一个学生的编号
251. for (int j=i;j<=n;j+=i) //从j=i开始,每次给j+i,使得i,i*2,i*3,...,这些灯全部都被拉一次开关
252. vis[j]=1-vis[j]; //1->0,0->1,本质上都是用1减去它本身。 253. int ans=0; //统计答案 254. for (int i=1;i<=n;i++)
255. if (vis[i]==1) //如果现在是开灯状态,答案加一 256. ans++; 257. cout< 上面的所有代码能够看懂,并且自己实现一遍,再练上几个类似的题,过机试肯定没问题,能够轻松写出上面的代码,那么机试优秀肯定没问题。想拿满分,请去学习搜索(dfs,bfs),树(先中后序遍历,及已知遍历对树的构造等),栈(怎么用数组模拟栈,栈的特性等),图 精选 论(最短路算法,连通性判断等),动态规划(这个就太多了,入门请看背包九讲)等等等等。虽然写了这么多,但高级题其实并没有这么难,高级题主要考搜索比较多一些,偶尔会有树、栈、图、动态规划的题目,不过,要想当个好码农,算法和数据结构基础是必须的 机试葵花宝典就写到这里了,大师兄在大华为等你们哪,来了我们一起在练独孤九剑,六脉神剑。 附好网上另一师兄机试心得,共小弟妹们参考: 华为机试成功归来,与小伙伴们分享下经验 前段时间参加华为机试,机试通过的可以优先录取,优先选择岗位和工作地,关键是面的好,还可以谈更高的工资,最多在西安可以拿到18W。好处还是蛮多的,抱着试试看的态度就去了。哈哈,华为机试记录正是开始。 提前在网上交了简历,周围同学只要报了软件研发类的相关岗位都收到短信通知,需要用到编程的同学基本上都受到短信了。一天三波,在西工大毅字楼三楼机房,南门进去直走左拐就到了,我是第二天早上的机试,前一天已经听机试过的同学考的内容涉及数组、链表、指针、字符串、循环、枚举、排序等吧,这个估计要看人品,平时出门多扶老奶奶过马路吧。其实考过后发现这个机试跟平时做项目不一样,项目可能更多的注重实现研究所需要的某个功能不会去注意这么多细节,但是机试考的更多的是基本功。下面重点跟大家分享下上机题吧,我只列举了我抽到的三个,其他同学抽到的跟这个大同小异吧。大家自己编写下,对即将开始的面试都会有帮助的。 考试内容:数组、链表、指针、字符串、循环、枚举、排序等(从考过的同学那儿总结的可能不全) 试题结构:考试总共三道题,说是难中易,初级题(60分)、中级题(100分)、高级题(160分),最难的接近一百行,说多不多,但自己敲出来还是费了点劲, 考试时间:两个小时。平时练得少可能稍微捉鸡点。 最简单的一个 描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下: (1) 及格线是10的倍数; (2) 保证至少有60%的学生及格; (3) 如果所有的学生都高于60分,则及格线为60分 输入:输入10个整数,取值0~100 输出:输出及格线,10的倍数 输入样例:61 51 49 30 20 10 70 80 90 99 输出样例:50 自己编写代码简单如下: 1. #include 4. void bubbleSort(int arr[]) 5. { 6. int i = 0; 7. int j = 0; 8. int t = 0; 9. 10. for(i = 0;i < 10; i++) 11. { 精选 12. for(j = 0; j < (9 - i); j++) 13. { 14. if(arr[j + 1] < arr[j]) 15. { 16. t = arr[j + 1]; 17. arr[j + 1] = arr[j]; 18. arr[j] = t; 19. } 20. } 21. } 22. } 23. 24. int getPassLine(int a[]) 25. { 26. int i = 0; 27. 28. bubbleSort(a); 29. 30. if (a[0] >= 60) 31. { 32. return 60; 33. } 34. else 35. { 36. return ((a[4] / 10) * 10); 37. } 38. 39. } 40. 41. 42. 43. int main() 44. { 45. int a[10] = {0}; 46. 47. scanf(\ &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]); 48. 49. printf(\ 50. 51. return 0; 52. } 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 精选 有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。注:电灯数和学生数一致。 输入:电灯的数量 输出:亮着的电灯数量 样例输入:3 样例输出:1 答案参考: 1. #include 3. #define MAX_BULB_NUM 65535 4. /* 5. 功能: n个学生按规定走完后,长廊里电灯有几盏亮着。 6. 原型: 7. int GetLightLampNum(int n); 8. 9. 输入参数: 10. int n: 电灯/学生的数量。 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 精选 返回值: int: 亮着的电灯数量。 */ int GetLightLampNum(int n) { char Bulb_Flag[MAX_BULB_NUM] = {0}; //0代表灯灭,1代表灯亮 unsigned int i; unsigned int j = 1; unsigned int Count = 0; if ((n < 1)||(n > 65535)) { return false; } while ( j <= n) { for (int i = 1; i <= n; i++) { if (0 == (i%j)) 34. { 35. Bulb_Flag[i-1] += 1; 36. Bulb_Flag[i-1] = Bulb_Flag[i-1]%2 ; //if操作用来反转满足条件的灯泡状态 37. } 38. } 39. j++; 40. } 41. 42. for (i = 0; i < MAX_BULB_NUM; i++) 43. { 44. if (1 == Bulb_Flag[i]) 45. { 46. Count++; 47. } 48. } 49. 50. return Count; 51. } 52. 53. int main(void) 54. { 55. int input; 56. scanf(\ 57. printf(\ 58. } 高级题样题:地铁换乘 描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。 地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15 输入:输入两个不同的站名 输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次 输入样例:A1 A3 输出样例:3 答案参考: 1. import java.util.*; 2. 3. 4. public class Main { 5. 精选