分糖果:10 个小孩围成一圈分糖果,老师分给第 1 个小孩 10 块,第 2 个小孩 2 块,第 3 个小孩 8 块,第 4 个小孩 22 块,第 5 个小孩 16 块,第 6 个小孩 4 块,第 7 个小孩 10 块,第 8 个小孩 6 块,第 9 个小孩 14 块,第 10 个小孩 20 块。然后所有的小孩同时将手中的糖果分一半给右边的小孩:糖块数为奇数的人可以向老师要一块。问经过这样几次后大家手中的糖块数一样多吗?每人各有多少块糖?
(我在网上找了一些方法,感觉都不太对,没有把同时弄清楚吧,他们都是依次算的。过多久不赘述了,自己在网上找找。以下是我的想法,如果有想法错误请提出。)
a=[10,2,8,22,16,4,10,6,14,20]
t=[0,0,0,0,0,0,0,0,0,0] #储存中间变量参数
#用len(a) 避免还要添加a中元素(增强扩展性)
count=0
while True:
#先将每个人中的糖减半
for i in range(len(a)):
t[i]=a[i]//2
#从第二个开始
for i in range(1,len(a)):
a[i]=t[i-1]+t[i]
#再算第一个
a[0]=t[0]+t[len(t)-1]
# 判断是否为偶数,否则加一
for i in range(len(a)):
if a[i] % 2 != 0:
a[i] = a[i] + 1
else:
pass
#打印数组a
# print(a)
#计数
count+=1
#判断是否一样多
if len(set(a))>1:
continue
else:
break
print(count,a)
用C语言
#include<stdio.h>
int main()
{
int a[10]={10,2,8,22,16,4,10,6,14,20},t[10],i,count=0;
while(1)
{
for (i=0;i<10;i++)
{
t[i]=a[i]/2;
}
for (i=0;i<9;i++)
{
a[i+1]=t[i]+t[i+1];
}
a[0]=t[0]+t[9];
for (i=0;i<10;i++)
{
if (a[i]%2!=0) a[i]++;
}
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
count++;
if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]&&a[3]==a[4]&&a[4]==a[5]&&a[5]==a[6]&&a[6]==a[7]&&a[7]==a[8]&&a[8]==a[9]) {break;}
}
printf("经过%d次每个人的糖果都是%d颗.",count,a[0]);
return 0;
}
另一种写法
#include <stdio.h>
int main1(void)
{
int a[10] = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20};
int i, j, n, tp, tn, t;
n = 0;
while(1)
{
n++;
for(tp = a[0]/2, i=0;i<10;tp = tn, i++)
{
t = a[(i+1)%10]; // 写%10 就不用单独的在算a[0] 以为 10%10=0, 就已经算了
tn = t/2;
t = tn + tp; /*换过后,糖果数位原来数的一半加左边人的一半*/
if(t % 2 == 1) /*如果是奇数,再要一块*/
t++;
a[(i+1)%10] = t;
}
for(i=0;i<10;i++) /*输出一轮以后所有人的糖果数*/
printf("%d ", a[i]);
printf("\n");
for(i=1;i<10;i++)
{
if(a[i] != a[0])
break;
}
if(i==10)
break;
}
printf("经过%d次,大家的糖都是%d块\n", n, a[0]);
return 0;
}