分糖果

bzsc / 2023-04-27 / 原文

一、问题描述:

  10个小孩围成- -圈分糖果, 老师分给第1个小孩10块,第2个小孩2块,第3个小孩8块,第4个小孩22块,第5个小孩16块,第6个小孩4块,第7个小孩10块,第8个小孩6块,第9个小孩14块,第10个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩:糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖块数一样多吗?每人各有多少块糖?

 

二、设计思路:

    题目有十个小孩,可以定义十个小孩的数组,然后思考循环的条件是什么,当每个孩子糖果数不相同时,就一直循环下去,所以我们可以采用while循环,题目又说每个小孩同时分一半给右边小孩,偶数还可以分,奇数则需要加1再分糖,这里我们还需要再建立一个数组来存储分一半后的数量,还有就是数组a[9]如何分一半给a[0]建立起一个圆圈般的循环然后就是判断循环是否继续的函数while(judge(a))此时函数的返回值决定。

 

三、程序流程图:

 

四、代码实现:

#include<stdio.h>
#define N 10
void print(int s[]);
int judge(int c[]);
int j=0;
int main()
{
    int a[N]={10,2,8,22,16,4,10,6,14,20};
    int b[10];
    int i,n;
    print(a);//输出没分之前每个孩子的糖果数量
    while(judge(a))
    {
        for(i=0;i<10;i++)
        {
            if(a[i]%2==0)
        
                b[i]=a[i]=a[i]/2;//偶数则之间分一半出去
        
            else b[i]=a[i]=(a[i]+1)/2;//奇数则加1后再分一半出去
        }
        for(n=0;n<9;n++)
        {
            a[n+1]=a[n+1]+b[n];
        }
            a[0]+=b[9];
            print(a);//输出当前每个孩子的糖果数
    }
    
    return 0;
}

int judge(int c[])
{
    int i;
    for(i=0;i<10;i++)
    {
        if(c[0]!=c[i])
        return 1;//不相同返回1
    }
        return 0;//相同返回0
    
}
void print(int s[])
{
    int k;
    printf("%d",j++);
    for(k=0;k<10;k++)
        printf("%4d",s[k]);
    printf("\n");
}

 说实话,这道题我写的时候没跑出来,天宇巨佬过来一看,

a[0]+=b[9] 
这个玩意我写进了for循环里面了,难受的捏,比五一,一个人过还难受