试题四
阅读下列说明和 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 <stdlib.h>
#include <stdio.h>
int getCounterfeitCoin(int coins[],int first,int last) {
//找假币
int firstSum = 0,lastSum = 0;
int i;
if(first == last - 1) {
/*只剩两枚硬币*/
if (coins[first] < coins[last])
return first;
return last;
}
if ((last - first + 1) % 2 ==0) {
/*偶数枚硬币*/
for (i = first; i < (first+last)/2; i++) {//填空1
firstSum += coins[i];
}
for (i = first + (last - first) / 2 + 1; i < last + 1; i++) {
lastSum += coins[i];
}
if (firstSum<lastSum) {//填空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 (first+last)/2;//填空3
}
}
}
【问题一】
根据题干说明,填充 C 代码中的空(1)-(3)
【问题二】
根据题干说明和 C 代码,算法采用了(4)设计策略。函数getCounterfeitCoin 的时间复杂度为(5)(用 O 表示)。
【问题三】
若输入的硬币数为 30,则最少的比较次数为(6),最多的比较次数为(7)。
试题六
阅读下列说明和 Java 代码,将应填入 (n) 处的字句写在答题纸的对应栏内。
【说明】
某快餐厅主要制作并出售儿童套餐,一般包括主餐(各类比萨)、饮料和玩具,其餐品种类可能不同,但其制作过程相同。前台服务员(Waiter) 调度厨师制作套餐。现采用生成器 (Builder) 模式实现制作过程,得到如图 6-1 所示的类图。
【Java 代码】
class Pizza{
private String parts;
public void setParts(String parts) {
this.parts = parts;
}
@Override
public String toString() {
return this.parts;
}
}
abstract class PizzaBuilder{
protected Pizza pizza;
public Pizza getPizza() {
return pizza;
}
public void createNewPizza(){
pizza = new Pizza();
}
public abstract void buildParts(); //填空1
}
class HawaiianPizzaBuilder extends PizzaBuilder{
@Override
public void buildParts() {
pizza.setParts("cross + mild + ham&pineapple");
}
}
class SpicyPizzaBuilder extends PizzaBuilder{
@Override
public void buildParts() {
pizza.setParts("pan baked + hot + pepperoni&salami");
}
}
class Waiter{
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pizzaBuilder){//设置构建器
this.pizzaBuilder= pizzaBuilder; //填空2
}
public Pizza getPizza(){
return pizzaBuilder.getPizza();
}
public void construct(){//构建
pizzaBuilder.createNewPizza();
pizzaBuilder.buildParts(); //填空3
}
}
public class PizzaTest {
public static void main(String[] args) {
Waiter waiter = new Waiter();
PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder();
waiter.setPizzaBuilder(hawaiian_pizzabuilder); //填空4
waiter.construct(); //填空5
System.out.println("pizza: "+waiter.getPizza());
}
}
//输出结果:
//pizza: cross + mild + ham&pineapple