#include<stdio.h>
int main(){
int n,m;
printf("输入总人数:\n");
scanf("%d",&n);
printf("输入数:\n");
scanf("%d",&m);
printf("最终留下的是%d号",fun1(n)); //函数调用与结果输出
return 0;
}
int fun1(int n,int m){
int r[n],i,num=0,time=0;
int *p=r; //指针初始化
for(i=1;i<=n+1;i++)
r[i-1]=i; //将这n个人编号从0~n)
while(1){
for(i=0,p=r;i<n;i++,p++){ //每轮初始化指针使其指向a[0]
if(*p!=0) //该人有没有没被出局
num++; //没被踢出则报数
if(num==m){ //如果计数器满三
*p=0; //标记该人被踢出
num=0; //计数器归零
time++; //记录出局人数
}
}
if(time==n-1)break; //是否即只剩1人,是则终止循环
}
for(i=0;i<n;i++) //查找每一个元素
if(r[i]!=0) //找到没被踢最后没有被踢出的人
return (i+1); //返回他的号码
}
约瑟夫问题
于 2024-01-07 20:50:22 首次发布