分糖果问题
幼儿园有n(<20)个孩子围成一圈分糖果,老师先随机地发给每个孩子若干颗糖果,然后按以下规则调整:每个孩子同时将自己手中的糖果分一半给坐在他右边的小朋友;如共有8个孩子,则第1个将原来的一半分给第2个,第2个将原有的一半分给第3个……第8个将原来的一半分给第1个,这样的平分动作同时进行;若平分前,某个孩子手中的糖果是奇数颗,则必须从老师那里要一颗,使他的糖果变成偶数。小孩人数和每个
小孩的初始数由键盘输入。经过多少次调整,使每个孩子手中的糖果一样多,调整结束时每个孩子有糖果多少颗,在调整过程中老师又新增发了多少颗糖果。
#include <stdio.h>#define N 20
int n
int equal(int [])
int main()
{
int num=0,count=0,i,t1,t2
int child[N]
printf("请输入小孩数:")
scanf("%d",&n)
printf("请输入每个小孩手中的原始糖数:")
for(i=0i<ni++)
scanf("%d",&child[i])
while(!equal(child))
{
for(i=0i<ni++)
{
if(child[i]%2!=0)
{
child[i]+=1
num+=1
}
}
t1=child[0]
for(i=0i<ni++)
{
t2=child[(i+1)%n]
child[(i+1)%n]/=2
child[(i+1)%n]+=t1/2
t1=t2
}
count+=1
for(i=0i<ni++)
printf("%d ",child[i])
printf("\n")
}
printf("经过%d次交换后糖数相等,糖数是%d颗\n调整过程中新发%d颗糖\n\n",count,child[1],num)
return 0
}
int equal(int child[])
{
int i
for(i=1i<ni++)
if(child[i]!=child[i-1])
return 0
return 1
}
运行结果
#include <stdio.h>#include <string.h>
int main(void)
{
int a[10] = { 12, 2, 8, 22, 16, 4, 10, 6, 14, 20 }
int i, j
int b[10]
do
{
for (i = 0 i < 10 ++i)
{
// 这里是a[i]
if (a[i] % 2)
a[i] = a[i] + 1
}
for (i = 0 i < 10 ++i)
{
a[i] = a[i] / 2
}
b[0] = a[0] + a[9]
for (i = 1 i < 10 ++i)
{
b[i] = a[i] + a[i - 1]
}
// i只能到9
for (i = 0 i < 9 ++i)
{
if (b[i] != b[i + 1])
break
}
j = i
// 把b数组的内容转移到a数组
memcpy(a, b, sizeof(a))
} while (j != 9)
for (i = 0 i < 10 ++i)
{
printf(" %d", b[i])
}
return 0
}