#include<stdio.h>
int getResult(int n,int m)
{
if(n < 0 || m < 0)
{
return -1;
}
int last = 0;
for(int i = 2;i <= n;i++)
{
last = (last+m)%i;
}
return (last + 1);
}
int main()
{
int n,m;
printf("请输入人数和序号(中间用逗号隔开):");
scanf("%d,%d",&n,&m);
printf("最后一个出局人的序号为:%d\n",getResult(n,m));
}
对于约瑟夫问题主要的就是要把题目的思路理清楚简单地说就是需要搞清楚算法是什么,大致的算法如上述代码所示。可以自己定义一个独立的函数模块专门用来解决约瑟夫问题。
这里补充一下约瑟夫问题的描述:N个人围成一圈,从第一个开始报数,数到M的人出队,然后他的下一位继续从1开始报数,数到M的出队,如此循环直到剩下一个人,求最后剩下的那个人最初是队伍中的第几位。解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否还在队伍中,首先将每个元素都置为1,表示全员都在队伍中。如果第N个人出队,则将第N个元素置为0。模拟报数可以使用一个累加计数器,用它表示这轮报数已有多少人报数,然后循环访问每个人,若其在队伍中,则将计数器+1,如果累加到M,则这个人出队。如此循环,直到N-1个人出队,仅剩1人。
最后遍历一下那个数组,找到还在队伍中的人就可以。