刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

阅读下列说明和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语言实现,其中:


coins[]: 硬币数组

first,last:当前考虑的硬币数组中的第一个和最后一个下标


#include <stdio.h>


int getCounterfeitCoin(int coins[], int first,int last)

{

int firstSum = 0,lastSum = 0;

int ì;

If(first==last-1){ /*只剩两枚硬币*/

if(coins[first] < coins[last])

return first;

return last;

}


if((last - first + 1) % 2 ==0){ /*偶数枚硬币*/

for(i = first;i <( 1 );i++){

firstSum+= coins[i];

}

for(i=first + (last-first) / 2 + 1;i < last +1;i++){

lastSum += coins[i];

}

if( 2 ){

Return getCounterfeitCoin(coins,first,first+(last-first)/2;)

}else{

Return getCounterfeitCoin(coins,first+(last-first)/2+1,last;)

}

}

else{ /*奇数枚硬币*/

For(i=first;i<first+(last-first)/2;i++){

firstSum+=coins[i];

}

For(i=first+(last-first)/2+1;i<last+1;i++){

lastSum+=coins[i];

}

If(firstSum<lastSum){

return getCounterfeitCoin(coins,first,first+(last-first)/2-1);

}else if(firstSum>lastSum){

return getCounterfeitCoin(coins,first+(last-first)/2-1,last);

}else{

Return( 3 )

}

}

}


【问题一】(6分)

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

【问题二】(4分)

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

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

【问题三】(5分)

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

使用微信搜索喵呜刷题,轻松应对考试!

答案:

【问题一】答案:

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

(2)firstSum<lastSum

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

【问题二】答案:分治法、O(nlogn)

【问题三】答案:2、4

解析:

问题一要求填充C代码中的空白部分。根据题干说明,当硬币数量为偶数时,我们需要将硬币分为两部分进行比较,而比较的中间点应该是硬币数量的一半加一的索引位置,所以(1)的答案应该是first+(last-first)/2 或 (first+last)/2+1。当比较的结果为firstSum < lastSum时,说明假币在较轻的那部分硬币中,因此(2)的答案是firstSum < lastSum。最后,(3)的答案是要继续在较轻的硬币部分中寻找假币的起始索引位置,即first+(last-first)/2 或中间硬币的索引。

创作类型:
原创

本文链接:阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。【说明】假币问题:有n枚硬币,

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share