问题 1047: [编程入门]报数问题 本质是约瑟夫死环
Posted wildness-priest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 1047: [编程入门]报数问题 本质是约瑟夫死环相关的知识,希望对你有一定的参考价值。
时间限制: 1Sec 内存限制: 128MB 提交: 3216 解决: 1753
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
#include<iostream> #include<algorithm> using namespace std; int main() { int n; cin>>n; int sum=n; int array[1000]; //数组下标全置1,到时候我只用1~n这n个位置,定义一个表示1个数的变量sum,出局就置零,同时sum-1 //当sum等于1,表示只剩一个人时,跳出循环,然后遍历数组找出未出局的那个人 for(int i=1;i<=n;i++) { array[i]=1; } int pos=1; for(int j=1;1;j++) { if(j%3==0)//只要j长到了3的倍数,就会使本次循环中的array[pos]置0 {//判断对3取余等于0(就相当于一直在做每3个数一次的循环) array[pos]=0; sum--; } if(sum==1) { break; } pos++; if(pos>n)//当 指针pos转了一圈,发现自己出界了,赶紧从头开始;注意!pos >n才表示出界 { pos=1; } while(1)//这个循环的目的是使得参选那个3次一循环的array[]必须是未出局的 { if(array[pos]==0) { pos++; if(pos==n+1) { pos=1; } } else { break; } } } for(int i=1;i<=n;i++) { if(array[i]==1) { cout<<i; break; } } return 0; }
以上是关于问题 1047: [编程入门]报数问题 本质是约瑟夫死环的主要内容,如果未能解决你的问题,请参考以下文章