|
|
51CTO旗下网站
|
|
移动端

试题四(14 分)

《软件设计师历年真题解析》本书针对软件设计师2014—2017年共8次真题进行了试题的分析和解答,帮助考生熟悉试题形式,了解重点、掌握解答问题的方法和技巧等。本节为试题四。

作者:薛大龙来源:电子工业出版社|2018-08-21 12:54

试题四(14 分)

阅读下列说明和C 代码,回答问题1 至问题3,将解答写在答题纸的对应栏内。

【说明】

假币问题:有n 枚硬币,其中有一枚是假币,已知假币的重量较轻。现只有一个天平,要求用尽量少的比较次数找出这枚假币。

【分析问题】

将n 枚硬币分成相等的两部分:

(1)当n 为偶数时,将前后两部分,即1…n/2 和n/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币:

(2)当n 为奇数时,将前后两部分,即1…(n-1)/2 和(n+1)/2+1…0,放在天平的两端,较轻的一端里有假币,继续在较轻的这部分硬币中用同样的方法找出假币;若两端重量相等,则中间的硬币,即第 (n+1)/2 枚硬币是假币。

【C 代码】

下面是算法的C 语言实现,其中:

  1. coins[]: 硬币数组  
  2. first,last:当前考虑的硬币数组中的第一个和最后一个下标  
  3. #include <stdio.h> 
  4. int getCounterfeitCoin(int coins[], int first,int last)  
  5. {  
  6. int firstSum = 0lastSum = 0;  
  7. int ì;  
  8. If(first==last-1){ /*只剩两枚硬币*/  
  9. if(coins[first] < coins[last])  
  10. return first;  
  11. return last;  
  12. }  
  13. if((last - first + 1) % 2 ==0){ /*偶数枚硬币*/  
  14. for(i = first;i <( 1 );i++){  
  15. firstSum+= coins[i];  
  16. }  
  17. for(i=first + (last-first) / 2 + 1;i < last +1;i++){  
  18. lastSum += coins[i];  
  19. }  
  20. if( 2 ){  
  21. Return getCounterfeitCoin(coins,first,first+(last-first)/2;)  
  22. }else{  
  23. Return getCounterfeitCoin(coins,first+(last-first)/2+1,last;)  
  24. }  
  25. }  
  26. else{ /*奇数枚硬币*/  
  27. For(i=first;i<first+(last-first)/2;i++){  
  28. firstSum+=coins[i];  
  29. }  
  30. For(i=first+(last-first)/2+1;i<last+1;i++){  
  31. lastSum+=coins[i];  
  32. }  
  33. If(firstSum<lastSum){  
  34. return getCounterfeitCoin(coins,first,first+(last-first)/2-1);  
  35. }else if(firstSum>lastSum){  
  36. return getCounterfeitCoin(coins,first+(last-first)/2-1,last);  
  37. }else{  
  38. Return( 3 )  
  39. }  
  40. }  

【问题1】(6 分)

根据题干说明,填充C 代码中的空(1)-(3)。

【参考答案】

(1)first+(last-first)/2 或(first+last)/2

(2)firstSum<lastSum

(3)first+(last-first)/2 或(first+last)/2

【问题2】(4 分)

根据题干说明和C 代码,算法采用了( )设计策略。

函数getCounterfeitCoin 的时间复杂度为( )(用O 表示)。

【参考答案】

分治法、O(nlogn)

【问题3】(4 分)

若输入的硬币数为30,则最少的比较次数为( ),最多的比较次数为( )。

【参考答案】

2、4


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Expert C# 2005 Business Objects中文版

本书描述了怎样应用面向对象的概念来进行.NET应用程序的架构、设计和开发。作者将重点放在了面向业务的对象,即业务对象和怎样在包括Web和...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊