问答题
【说明】
幼儿园有n(<20)个孩子围成一圈分糖果。老师先随机地发给每个孩子若干颗糖果,
然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友。如共有8个孩子,则第1个将原有的一半分给第2个,第2个将原有的一半分给第3个,……,第8个将原有的一半分给第1个,这样的平分动作同时进行。若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果数变成偶数。小孩人数和每个小孩的初始糖果数由键盘输入。下面的程序可求出经过多少次上述这样的调整,使每个孩子手中的糖果—样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。
【程序】
#include <stdio.h>
#define N 20
int allEqual (int a[ ],int n) /*检查每个孩子手中的糖果是否一样多*/
{ iht i;
for(i=1; i<n; i++)
if(a[O]!=a[i]) return O;
return 1;
}
int a[N], b[N];
void main ( )
{ int i, n, addk, loopc;
printf("Enter n((20)/n"); scanf("%d", &n);
printf ("Enter data/n");
for( i=O; i(n; i++) scanf("%d", &a[i]);
addk=O; {{U}}(1){{/U}};
while {{U}}(2){{/U}}{ /*平分循环*/
loopc++;
for ( i=O; i ( n; i++){ /*为一次调整作准备*/
if(a[i]%2) { a[i]++; {{U}}(3){{/U}}; }
if (i<n-1) b[i+1]=a[i]/2; else{{U}}(4){{/U}}
a[i]/=2;
}
for(i=O; i<n; i++){{U}}(5){{/U}}; /*完成一次调整*/
}
printf("调整%d次/n", loopc); printf("每个孩子有%d颗糖果/n", a[0]);
printf("调整过程中新增发%d颗糖果。/n", addk); }
【正确答案】
【答案解析】(1)loopc=0
//loopc设置初值为0
(2)! a11Equal(a, n) 或者 a11Equal (a, n)==0
//判断奈件a11Equal (a, n)是否为假
(3)addk++或者addk=addk+1
//addk的值增加1
(4)b[0]=a[i]/2
//如果条件不满足,b[0]的值是a[i]/2
(5)a[i]+=b[i]或者a[i]=a[i]+b[i]
//a[i]增加b[i]