初级系列13.分糖果问题

分糖果

问题描述

十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块 第七个小孩10块,第八个小孩6块,第九个小孩14块,第十个小孩20块 然后所有的小孩同时将手中的糖分一半给右边的小孩,糖块数为奇数的人 可向老师要一块,问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?

问题分析

根据题意,十个小孩开始时所拥有的糖果数是不同的,但分糖的动作却是相同的,即所有的小孩同时将手中的糖分一半给右边的小孩,糖块数为奇数的人可向老师要一块,因此这是一个典型的可使用循环结构来解决的问题

算法设计

使用数组来存放老师开始给每个小孩分配的糖果数,因为有十个小孩,故定义一个长度为10的整型数组

在循环过程中,糖果每经过一次重新分配,就打印输出一次,直到最后一次打印时,十个小孩所拥有的

糖果数都相同,此时结束循环

#include <stdio.h>

void print(int s[]);
int judge(int c[]);
int j = 0;      /* !<记录糖果分配次数 */

int main(void)
{
    int sweet[10] = {10, 2, 8, 22, 16, 4, 10, 6, 14, 20};   /* !< 初始化数组数据*/
    int i, t[10], a;
    printf("child 1 2 3 4 5 6 7 8 9 10
");
    printf("..........................
");
    printf("time
");
    print(sweet);       /* !<输出每个孩子手中糖果的块数*/
    while (judge(sweet)) {  /* !<若不满足要求则继续进行循环*/
        /* !<将每个孩子手中的糖果分成一半*/
        for (i = 0; i < 10; i++) {
            if (sweet[i] % 2 == 0) {    /* !<若为偶数则直接分出一半*/
                t[i] = sweet[i] = sweet[i] / 2;
            }
            else {  /* !<若为奇数则加1后再分出一半 */
                t[i] = sweet[i] = (sweet[i]+1) / 2;
            }
        }
        /* !<将分出的一半糖果给右边的孩子 */
        for (a = 0; a < 9; a++) {
            sweet[a+1] = sweet[a+1] + t[a];
        }
        sweet[0] += t[9];
        print(sweet);   /* !<输出当前每个孩子手中的糖果数 */
    }
}

/* !<判断每个孩子手中的糖果数是否相同 */
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("%2d", j++);
    for (k = 0; k < 10; k++) {
        printf("%4d", s[k]);
    }
    printf("
");
}
/* !<output */
    child 1 2 3 4 5 6 7 8 9 10
    ..........................
    time
     0  10   2   8  22  16   4  10   6  14  20
     1  15   6   5  15  19  10   7   8  10  17
     2  17  11   6  11  18  15   9   8   9  14
     3  16  15   9   9  15  17  13   9   9  12
     4  14  16  13  10  13  17  16  12  10  11
     5  13  15  15  12  12  16  17  14  11  11
     6  13  15  16  14  12  14  17  16  13  12
     7  13  15  16  15  13  13  16  17  15  13
     8  14  15  16  16  15  14  15  17  17  15
     9  15  15  16  16  16  15  15  17  18  17
    10  17  16  16  16  16  16  16  17  18  18
    11  18  17  16  16  16  16  16  17  18  18
    12  18  18  17  16  16  16  16  17  18  18
    13  18  18  18  17  16  16  16  17  18  18
    14  18  18  18  18  17  16  16  17  18  18
    15  18  18  18  18  18  17  16  17  18  18
    16  18  18  18  18  18  18  17  17  18  18
    17  18  18  18  18  18  18  18  18  18  18

    Process returned 0 (0x0)   execution time : 0.013 s
    Press any key to continue.
原文地址:https://www.cnblogs.com/xzpin/p/11484593.html