分糖果

分糖果: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; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值