C习题_围圈报数

题目:
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
该题跟以下题类似:
一群猴子都有编号,编号分别是1,2,3 ...n ,这群猴子(n个)按照1到n的顺序顺时针围坐一圈,从编号为1的猴子开始顺时针报数,每数到m(m<n),则该猴子就要离开此圈,再从下一个猴子开始数,每数到m, 则该猴子离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

/* 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数)
凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 */
#include <stdio.h>
#define SIZE 100

void main(void)
{
int a[SIZE]; //假定最大求人数的是100人,可自行更改数组的大小;
int i,j,k,n;
printf("请输入总人数:");
scanf("%d", &n);

for(i=0;i<n;i++)
a[i]=i+1; //从1开始,按顺序给每人编号;
i=0;j=1;k=0;
while(j<n) //退出圈子的人为总人数减1,即只能留下1个
{
if(a[i]!=0)
k++;
if(k==3)
{
a[i]=0; //数到3时,将该编号化为0,以表示退出圈子;
k=0;
j++; //当退出圈子的人数等于总人数时终止循环;
}
i++; //编号每次+1;
if(i==n) //当报数者超过总人数时(因i从0开始计,i==n时超过1人)返回第1位开始重新判定
i=0;
}
for(i=0;i<n;i++)
{
if(a[i]!=0)
{
printf("最后留下的是原来第%d号!\n",a[i]);
/* 该句还能这样写:
printf("最后留下的是原来第%d号!\n",i+1);
因a[0]表示的是第1位,所以第i个元素的是i+1位。*/
}
}
}
/*程序在VC++6.0执行结果如下:
----------------------
请输入总人数:10
最后留下的是原来第4号!
----------------------
*/


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值