#include<stdio.h> int main() { int p[20],m,i,n,a,sum,j; scanf("%d %d",&n,&m); for(i=0;i<n;i++) { p[i]=i+1; } sum=n; i=0; a=0; while(1) { if(i+1==m) { p[a]=0; i=0; n--; } if(n==1) { while(1) { if(p[a]!=0){ printf("%d",p[i]); break; }else {a++;} } } if(p[a]!=0) {i++;} a++; if(a==sum-1) { a=0; } printf("\n"); } return 0; }分析
时间: 2024-02-15 17:27:15 浏览: 51
#include <stdio.h>
这段代码是一个经典的约瑟夫问题(Josephus problem)的解法,该问题是一个著名的数学问题,具体描述如下:
有n个人围成一圈,从第1个人开始报数,报到m的人离开,下一个人再从1开始报数,报到m的人离开,以此类推,直到剩下最后一个人,求最后一个人的编号。
该代码实现的思路是,将所有人的编号存入数组p中,然后循环遍历数组,每次数到m就将该人的编号设为0,表示该人已经离开游戏,然后将数组中剩余人的数量n减1。最后当数组中只剩下一个人时,输出该人的编号即可。
需要注意的是,该代码中的输出语句有误,应该将printf("%d",p[i]);改为printf("%d",p[a]);才能正确输出最后一个人的编号。
阅读全文