问答题 阅读以下说明和C函数,将应填入{{U}} (n) {{/U}}处的字句写在答题纸的对应栏内。
{{B}}[{{/B}}说明1{{B}}]{{/B}}
函数Counter(int n, int w[])的功能是计算整数n的二进制表示形式中1的个数,同时用数组w记录该二进制数中1所在位置的权。
例如,十进制数22的二进制表示为10110。对于该二进制数,1的个数为3,在w[0]中存入2(即21)、w[1]中存入4(即22)、w[2]中存入16(即24)。
{{B}}[{{/B}}C函数1{{B}}]{{/B}}
int Counter(int n,int w[])
{ int i =0,k=1;
while({{U}} (1) {{/U}}) {
if (n% 2) w[i ++] =k;
n=n/2;{{U}} (2) {{/U}};
}
return i;
}
{{B}}[{{/B}}说明2{{B}}]{{/B}}
函数Smove(int A[],int n)的功能是将数组中所有的奇数都放到所有偶数之前。其过程为:设置数组元素下标索引i(初值为0)和j(初值为n-1),从数组的两端开始检查元素的奇偶性。若A[i]、A[j]都是奇数,则从前往后找出一个偶数,再与A[j]进行交换;若A[i]、A[j]都是偶数,则从后往前找出一个奇数,再与A[i]进行交换;若A[i]是偶数而A[j]是奇数,则交换两者,直到将所有的奇数都排在所有偶数之前为止。
{{B}}[{{/B}}C函数2{{B}}]{{/B}}
void Smove(int A[],int n)
{ int temp,i=0,j=n-1;
if(n<2) return;
while (i<j){
if(A[i] % 2==1 && A[j]% 2 ==1){{{U}} (3) {{/U}};}
elseif(A[i]% 2 ==0 &&A[j]% 2 ==0){{{U}} (4) {{/U}};}
else {
if({{U}} (5) {{/U}}) {
temp=A[i];A[i]=A[j];A[j]=temp;
}
i++, j--;
}
}
}
【正确答案】
【答案解析】(1) n!=0 (2) k*=2 (3) i++ (4) j++ (5) (A[i]%2==0)&&(A[j]%2==1) [解析] 根据函数1的例子看出while循环中就是要把十进制整数。转换为二进制,并对为1的位数进行保存,所以循环的条件就是“n!= 0”,一旦n=0,就说明n的二进制已经表示完毕,所以空(1)的答案为“n!=0”或者是“n>0”。每执行一次“n=n/2”,二进制的数就增加一位,因为要保存二进制数中1所在位置的权,所以k的值就需要乘以2来记录当前位置的权,故空(2)的答案为“k=k*2”或者“k*=2”。空(3)是满足条件A[i]和A[j]都是奇数时的处理过程,从“说明2”中我们知道这时候需要“从前往后找出一个偶数”,所以空(3)的答案为“i++”,向后寻找偶数;空(4)是满足条件A[i]和A[j]都是偶数时的操作,这时需要“从后往前找出一个奇数”,所以空(4)的答案为“j--”,从后面向前寻找奇数;满足空(5)的条件之后的操作是将AC[i]和A[j]进行交换,从“若A[i]是偶数而A[j]是奇数,则交换两者”这句话,可以看出满足将A[i]和A[j]进行交换的条件是A[i]是偶然而A[j]是奇数,即空(5)的答案为“(A[i]%2==0)&&(A[i]%2==1)”。