您当前的位置:首页 > 计算机 > 编程开发 > C语言

C语言分糖果问题

时间:12-29来源:作者:点击数:

问题描述

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

问题分析

这是一个典型的可使用循环结构来解决的问题。老师开始给每个小孩分配的糖果数作为循环的初始条件,“所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块”这个重复的动作作为循环体,循环的结束条件为所有小孩手中的糖块数一样多。在循环体中,还需要判断糖块数的奇偶性,奇偶性不同,完成的操作也不相同,显然这需要使用一个选择结构来实现。

算法设计

使用数组来存放老师开始给每个小孩分配的糖果数,因为有10个小孩,因此定义一个长度为10的整型数组即可。在循环过程中,糖果每经过一次重新分配,就打印输出一次,直到10个小孩所拥有的糖果数都相同,此时结束循环。所以还应加上判断程序,条件为10个小孩所拥有的糖果数都相同。

程序流程图如下:

下面是完整的代码:

#include<stdio.h>
void print(int s[]);
int judge(int c[]);
int j=0;
int main()
{
    int sweet[10] = { 10, 2, 8, 22, 16, 4, 10, 6, 14, 20 };  /*初始化数组数据*/
    int i, t[10], l;
    printf("child  1   2   3   4   5   6   7   8   9  10\n");
    printf("………………………………………………………………\n");
    printf("time\n");
    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( l=0; l<9; l++ )  /*将分出的一半糖给右(后)边的孩子*/
            sweet[l+1] = sweet[l+1] + t[l];
        sweet[0] += t[9];
        print(sweet);  /*输出当前每个孩子中手中的糖果数*/
    }
   
    return 0;
}
int judge( int c[] )
{
    int i;
    for( i=0; i<10; i++)  /*判断每个孩子手中的糖果数是否相同*/
        if(c[0]!=c[i])
            return 1;  /*不相同返回1*/
    return 0;
}
/*输出数组中每个元素的值*/
void print(int s[])    
{
    int k;
    printf(" %2d:", j++);
    for( k=0; k<10; k++ )
        printf("%4d", s[k]);
    printf("\n");
}

运行结果:

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

知识点补充

int judge( int c[] )
{
    int i;
    for( i=0; i<10; i++ )  /*判断每个孩子手中的糖果数是否相同*/
        if(c[0]!=c[i])
    return 1;  /*不相同返回1*/
    return 0;
}

当指针 c 接收了实参数组 sweet 的首元素地址时,c 就指向了 sweet 数组的首元素,即 sweet[0],则 *c 的值就是 sweet[0] 的值。而 c+1 就指向了 sweet[1],c+2 就指向了 sweet[2],依次类推,c+i 就指向了 sweet[i],那么 *(c+1)、*(c+2) 和 *(c+i) 就分别是数组元素sweet[1]、sweet[2] 和 sweet[i] 的值。这样就通过调用 judge() 函数改变了实参数组 sweet 中数组元素的值。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门