华为机试——约瑟夫环变种
输入一个由随机数组组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数组首位置开始计算,计算到m后,将该数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下位置从新开始技术,知道数列所有数值出列位置。如果计数到达数列尾段,则返回数列首位置继续计数。请编写程序实现上述技术过程,同时输出数值出列的顺序。
示例:
输出:output_array[]={2,3,1,4}
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
void Joes(int n,list<int> &number,int m)
{
if(n < 1||m <1 )
return ;
list<int>::iterator current=number.begin();
while(number.size()>0)
{
while(--m)
{
current++;
if(current == number.end())
current=number.begin();
}
m=*current;
cout<<*current<<" ";
list<int>::iterator next=++current;
if(next == number.end())
next=number.begin();
--current;
number.erase(current);
current=next;
}
}
int main()
{
int len,m;
list<int> number;
cin>>len;
int num;
for(int i=0;i<len;i++)
{
cin>>num;
number.push_back(num);
}
cin>>m;
Joes(len,number,m);
return 0;
}