求围圈问题的详细算法和程序

/*17人围成一圈,编号为1,2,3,……,17,从1开始报数,报到3的倍数的人离开,
一直下去,直到最后剩下1人,求此人的编号  */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a[17]={0};
  int i, count, s;
 
   for (i = 0;i < 17;i++)
    {
        a[i] = i + 1;    /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
    } 
    i=0;
    s=17;  //用来记录退出圈外的人的数目
    count=0;  //计数器
    while(s > 1)
    {
   for(i=0; i<17; i++)
    if(a[i] != 0)
    {
     count++;    //报一次数
     if(count == 3)  //每报到一次3,该人退出
     {
      printf("%d\n",a[i]);    /* 把这个家伙打印出来 */
      a[i] = 0;
      count = 0;  //计数器归零
      s--;
     }
    }
  }
 
  for(i=0; i<17; i++)
   if(a[i] != 0)
     printf("最后一个是:%d\n",a[i]);
    
  system("pause");
    return 0;                
}

算法2:

/*求围圈问题的详细算法和程序*/
/*17人围成一圈,编号为1,2,3,……,17,从1开始报数,报到3的倍数的人离开,
一直下去,直到最后剩下1人,求此人的编号  */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int a[17]={0};
  int i, j, s;
 
   for (i = 0;i < 17;i++)
    {
        a[i] = i + 1;    /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
    } 
    i=0;
    s=17;
    j=0;
    while(s > 1)
    {
   if(a[i%17] != 0)
   {
    if((i+1-j)%3 == 0)
    { 
     printf("%d\n",a[i%17]);    /* 把这个家伙打印出来 */
     a[i%17] = 0;
     s--;
    }
   }
   else
    j++;   
   i++;
  }
 
  for(i=0; i<17; i++)
   if(a[i] != 0)
     printf("最后一个是:%d\n",a[i]);
  system("pause");
    return 0;                
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值