用c语言解释一下约瑟夫环问题
时间: 2024-02-12 07:59:52 浏览: 127
约瑟夫环问题是一个经典的问题,描述如下:有n个人围成一圈,从第一个人开始报数,报到m的人出圈,剩下的人继续从1开始报数,直到剩下最后一个人。现在给定n和m,求最后剩下的人的编号。
以下是两种用C语言解决约瑟夫环问题的方法:
1. 递归法
```c
/* 用递归解决约瑟夫环问题 n指的是总人数,m指的是每次最大报到的数值,i是第i次,该函数每次可以求出第i次扔海里的人的编号 */
int Algo3(int n,int m,int i){
if(i==1) return (n+m-1)%n;
else return (Algo3(n-1,m,i-1)+m)%n;
}
void main(){
int n=5; //假设5个人围坐一圈
int m=2; //数到2的那个人出环
printf("假设第一次从编号为1的人开始数,数到%d的那个人出环\n",m);
for(int i=1;i<=n;i++)
printf("第%d次出环的元素是%d\n",i,Algo3(n,m,i)+1); //因为求出的结果是数组中的下标,最终的编号还要加1
}
```
2. 迭代法
```c
/* 用迭代解决约瑟夫环问题 递推公式: f(N,M)=(f(N−1,M)+M)%N f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号 f(N−1,M)表示,N-1个人报数,每报到M时杀掉那个人,最终胜利者的编号 */
int Algo4(int n,int m){
int i,p=0;
for(i=2;i<=n;i++){
p=(p+m)%i;
}
return p+1; //因为求出的结果是数组中的下标,最终的编号还要加1
}
void main(){
int n=5; //假设5个人围坐一圈
int m=2; //数到2的那个人出环
printf("假设第一次从编号为1的人开始数,最后出环的是:%d\n",Algo4(n,m));
}
```
阅读全文
相关推荐
















