筛选最后的值

来源:互联网 发布:风险控制矩阵图 编辑:程序博客网 时间:2024/05/29 14:22

n人围成一圈,顺序排号。从第1个人开始报数(从13报数),凡报到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];
 }
}