n个人围成一圈报数,报到m的人被杀死,最后剩下一个人,问这个人应改站在第几个位置?
对这个问题有两种方法,一种用计数器去模拟报数的过程,另一种是用递归或者循环
1.计数器模拟
这个方法其实不是特别好,一方面是用了数组不太灵活,二是有点复杂
#include<stdio.h>
int main()
{
int m, n;
int count = 0; //用于记录被杀死的人数
int i,k = 0; //k用于当报数的计数器
int person[200] = {
0}; //用数组保存每个人的状态,0为活着,1为死亡
printf("请输入n,m:");
scanf("%d %d",&n, &m);
while(count != n-1)
{
for(i=0;i < n;i++)
{
if(person[i] == 0) //活着的人报数
{
k++;
if(k == m) //报到m被杀死
{
k = 0;
person[i] = 1;
count++;
}
}
}
}
for(i=0;i < n;i++)
{
if(person[i] == 0)
printf("第%d个人\n", i+1);
}
}
2.用递归或者循环
当n=2,m=2时,活下的人位置x为0
当n=3,m=2时,活下的人位置x为2
当n=4,m=2时,活下的人位置x为0
当n=5,m=2时,活下的人位置x为2
…
当m=p时,x1 = (x0 + p)%n
#include<stdio.h>
/*int fact(int n, int m) //用递归的方法
{
if (n == 1)
return 0;
else
return (fact(n - 1, m) + m) % n;
}*/
int main()
{
int m, n;
int x,count=1;
scanf_s("%d %d" ,&n, &m);
x = 0; //x为最后剩下的人的位置(从0开始计数)
while (count < n) //用循环的方法
{
count++;
x = (x + m) % count;
}
//x = fact(n, m);
printf("%d\n", x +1);
}