阅读以下说明和C函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
【说明1】函数Counter(intn,intw[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。例如,十进制数22的二进制表示为10110。对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)、w[2]中存入16(即24)。【C函数1】
【说明2】函数Smove(intA[],intn)的功能是将数组中所有的奇数都放到所有偶数之前。其过程为:设置数组元素下标索引i(初值为0)和j(初值为n-1),从数组的两端开始检查元素的奇偶性。若A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与A[j]进行交换;若A[i]、A[j]都是偶数,则从后往前找出一个奇数,再与A[i]进行交换;若A[i]是偶数而A[j]是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。【C函数2】
参考答案:
(1)n!=0,或其等价形式 (2)k=k木2,或k *=2,或k+=k,或k=k +k,或其等价形式 (3)i++,或++i,或1+=1,或i=i+1,或其等价形式 (4) j--,或--j,或j-=1,或j=j-1,或其等价形式 (5)A[i]%2==0&&AD]%2 !=1,或A[i]%2!=0&&A[j]%2,或!(A[i]%2)&&A[j]%2,或其等价形式
解析:
本题考查C程序控制结构的应用。 根据题目描述,函数Counter(int n,int w[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。要计算n的二进制形式中1的个数,基本方法是计算 n的二进制数时进行计数,题中的函数Counter采用的就是此方法。十进制数转换为二进制数的方法是辗转除以2取余数,直到被除数为0时为止。例如,十进制数26的二进制形式为11010,计算步骤为:
①被除数是26,除数是2,商为13,余数为0;
②被除数是13,除数是2,商为6,余数是1;
③被除数是6,除数是2,商为3,余数是0;
④被除数是3,除数是2,商为1,余数是1;
⑤被除数是1,除数是2,商为0,余数是1。
计算结束。从上例可知,二进制数的各位是从低到高依次计算出来的。
因此,函数Counter中的空(1)处应填入n或n!=0。显然,代码中用k记录二进制数各位的权值,其初始值为1,每算出1位,其值要改为上一位 权值的2倍。因此空(2)处应填入k=k*2或k*=2。对于函数Smove(int A[],int n),其功能是将数组中所有的奇数都放到所有偶数之前。分析题中给出的处理过程,交换动作发生在A[i]为偶数而A[j]为奇数时,因此空(5)处应填 入"A[i]%2==0&&A[j]%2 !=0"(或其等价表示方式),其他情况下都是修改i和(或)j的值。下面举一例进行说明,设数组A中的元素初始排列为15,20,23,30,77, 62, 45, 68, 34, 61。初始时i=0,j=n-1=9。A[0]=15,A[9]=61,A[0]是奇数,所以其值保持不动,A[9]也是奇数,需要将其前移,实质上是要找 出前面的一个偶数与其对调,这就需要增加下标i的值,从而向后找偶数。对应的代码是i++,j不变,因此空(3)处应填入i++或等价表示方式。接下来找 到的偶数是A[1],将其与A[9]对调,数组中的元素排列情况为15,61,23,30,77,62,45,68,34,20。之后i++,j--,对 应的数组元素为A[2](值为23,是奇数)和A[8](值为34,是偶数),这种情况下显然不需要进行对调,因此将i增1、j减1,找到A[3]和 A[7]。由于A[3](值为30)和A[7](值为68)都是偶数,因此需要从后面找出一个奇数,将其与A[3]对调。因此,空(4)处应填入j-- (或等价表示方式)。接下来找到A[6],交换A[3]和A[6]的值,数组元素的排列情况为15,61, 23, 45, 77, 62, 30, 68, 34, 20。 这样,数组中的奇数全部排在偶数之前。