有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
#include<iostream>
using namespace std;
int main()
{
void del(int m[],int n);
int n;
cin>>n;
int a=n;
int*b=new int[n];//分配n个指向int的指针
int i,j;
for(i=0;i<a;i++)
{
b[i]=i+1;//记录各个元素的初始位置,以便输出最后留下的人的编号
}
if(n>1)
{
del(b,n);
cout<<b[1]<<endl;
}
else
{
cout<<b[0]<<endl;
}
}
void del(int m[],int n) //用来删除序号为3的元素
{
void yi(int m[],int l,int c);//重新排序
int i,b,c=0;
while(n>3)
{
for(i=0;i<n;i++)
{
b=(i)/3; //判断最近删除的是第几次删除,以便判断后面的元素该移动多少位
m[i-b]=m[i];//移动后面的元素掩盖被删除的元素
}
c=n%3;//记录多余的数
n=n-n/3;
yi(m,n,c);
}
}
void yi(int m[],int l,int c)
{
int i,tem[c];
for(i=0;i<c;i++)
{
tem[i]=m[l-c+i];
}
for(i=l-c;i>=0;i--)
{
m[i+c-1]=m[i-1];
}
for(i=0;i<c;i++)
{
m[i]=tem[i];
}
}