约瑟夫环

本文深入探讨了约瑟夫环这一经典的逻辑程序问题。通过使用标志位来标记已退出的参与者,并设置循环条件使计数能回到起始位置,最终确定最后一个幸存者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

约瑟夫环是我接触到的最难的一个逻辑的程序,下面我来谈一下我对于这个程序的理解。首先这是一个报数问题,报到3即退出,直到最后一个人。关键在于怎么让人退出。本段程序利用了一个标志101代表退出,0代表仍然留在圈子里。在退出了一个人之后,总人数会减少一个。接下来的问题就是怎么返回,因为到目前为止我们只能操作一轮,不能形成一个圈。所以到了最后一个人时,我们要加个判断语句:people == i 才可以返回到第一个人继续计数。当只剩一个人的标志是0时即输出。

 

#include <stdio.h>

 

int main()

{

int people, i = 0, count = 0, tmp;

char flag[1000] = {0};

 

printf("please input people :\n");

scanf("%d", &people);

 

tmp = people;

while(1)

{

i++;

 

if (flag[i] == 0)

{

count++;

if (3 == count)

{

count = 0;

flag[i] = 1;

 

tmp--;

if (1 == tmp)

{

break;

}

}

}

if(people == i)

{

i = 0;

}

}

for(i = 1; i <= people; i ++)

{

if(flag[i] == 0 )

{

printf("the last one is %d\n", i);

}

 

}

return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值