【C语言】数组-报数问题

(一)问题要求

题目描述:

       n个小朋友做游戏,编号从1到n。他们按编号大小从小到大依次顺时针围成一个圈,第一个小朋友开始报1,顺时针方向报数加1,报m的人会离开,下一个小朋友继续报1,直到只剩一个小朋友。

输入:

      两个正整数n,m(均不超过1000)。

输出:

     最后一个小朋友编号。

(二)解题思路

       通过观察这个题,可以发现这个题包含两个量。

       一个是小朋友们的编号,这个是自始至终不变的量,而且最后也要求输出最终剩下小朋友的编号;另一个是他们报数的数值,在有人出局重新报数时,是变化的量。

      于是我想到了一个方法:

①声明一个数组a[i],用数组a[i]来储存每个小朋友的编号。

②然后在一个循环之中,先定义一个变量k=0k按照题目要求开始递增,等到等于m时就把k重置为零,并把这时的a[i]赋值为零

③最后只剩下一个a[i]的数值不等于零,把这个a[i]的数值输出,这个数值就是最后剩下的小朋友的编号。   

#include<stdio.h>
int main()
{
    int n;
    int m;
    int i;
    int k = 0;
    int l = 0;//n为总数,m为固定数字,l为离队的小朋友数目
    scanf("%d %d", &n, &m);
    int c[n];
    for(i=0; i<n; i++)
        c[i] = i+1;   //把每个小朋友的编号存入数组中
    
    while(l < n-1)
    {
        for(i=0; i<n; i++)
        {
            if(c[i])
            {                               //若这个数组没有被赋值为零就可以接着运算  
                k++;
                if(k == m)
                {
                    c[i] = 0;//小朋友离队,把他的数组赋值为零
                    k = 0;   //k重置为零
                    l++;     //离队小朋友数+1 
                    if(l == n-1)
                    {                       //当离队小朋友达到n-1人时 
                        for(i=0; i<=n; i++)
                        {
                            if(c[i])
                            {
                                printf("%d", c[i]);//输出剩下小朋友的编号 
                                break;
                            }           
                        }
                        break;
                    }
                }   
            }
        }
    }
    return 0;
}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良禽泽木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值