2037:【例5.4】约瑟夫问题【题目描述】N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈; …输出依次出圈的人的编号。 【输入】输入N和M。 【输出】输出一行,依次出圈的人的编号。 【输入样例】8 5 【输出样例】5 2 8 7 1 4 6 3 【提示】【数据范围】 对于所有数据,2≤N,M≤1000。 |
教学备忘录:编辑 |
#include<iostream> #include<cmath> #include<cstring> using namespace std; int main() { int a[1002],n,m,j,k=0,x,t=0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) a[i]=1;//从1到n的数组中元素都置1 for(j=1;;j++){ x=j%n;//x是数组中的序号,一直不大于n if(j%n==0)x=n; k+=a[x];//k为计数器,等于m时做判断 if(k==m){ a[x]=0; t+=1; k=0; printf("%d ",x); if(t==n)break; } } return 0; } |