约瑟夫环问题的详细解答

来源:互联网 发布:java.io.file jar包 编辑:程序博客网 时间:2024/04/28 19:06

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人从1开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,知道圆桌周围的人全部出列。

分析:首先,标识这n个人,第一种标识方法是从0开始讲n个人标识为0~n-1;第二种方法是从1开始标识,将这n个人标识为1~n.

第一种情况下从0开始编号,编号为k的从环中移除之后,下一个要移除的是(k+m)%n(假设当前还有n个人在环中)。

第二种情况下从1开始编号,编号为k的从环中移除之后,下一个要移除的是(k+m-1)%n+1;

若从x编号开始怎要移除的编号的通式是(k+m-x)%n+x;

#include<iostream>using namespace std;//约瑟夫环利用数组实现int main(){const int n=8;int m=4;int a[n];for(int j=0;j<n;j++)a[j]=j+1;int k=1;int i=-1;while(1){for(int j=0;j<m;){i=(i+1)%n;if(a[i]!=0)j++;}if(k==n)break;cout<<a[i]<<",";a[i]=0;k++;}cout<<a[i]<<endl;return 0;}


0 0
原创粉丝点击