本文共 915 字,大约阅读时间需要 3 分钟。
//约瑟夫问题//模拟题要仔细思考清楚基本架构后再上手,不要写着添着改着,很容易逻辑混乱!#include#include #include using namespace std;int flag[305];void init(){ for(int index = 0; index < 305; index++) flag[index] = 0;}int main(){ int n, m; scanf("%d%d",&n,&m); while(n!=0 && m!=0){ int index = -1, cont = 0; init(); //全都没有数过 for(int i = 1; i < n; i++){ cont = 0; while(cont != m){ index = (index+1)%n; //到圈尾,取模 if(flag[index] == 0){ //如果还没有退出圈,累加数量。如果累加到m,则该位置的点退出,置1 cont++; if(cont == m) flag[index] = 1; } } } //打印最后未圈出的点 for(int j = 0; j < n; j++){ if(flag[j] == 0){ printf("%d\n",j+1); break; } } scanf("%d%d",&n,&m); } return 0;}
转载地址:http://gezdf.baihongyu.com/