1~2循环喊,到2出去一个,然后1~3循环喊,到3再出去,一直循环,3个以下结束,我用了三个数组来回存储数据
#include<iostream> #include<cstring> #define N 5005 using namespace std; int main() { int t,x; cin >> t; while(t--) { int a[N],b[N],c[N]; cin >> x; memset(a,0,sizeof(a)); int length=x; for(int i=0;i<x;i++) c[i]=i; while(x>3) { int j=0,flag1=1,flag2=1,m=0; for(int i=0;i<x;i++) { if(flag1<0) { if(a[c[i]]==0) a[c[i]]=1; } else { b[j]=c[i]; j++; } flag1=flag1*(-1); } x=(x+1)/2; if(x<=3) break; for(int i=0;i<j;i++) { if(flag2%3==0) { if(a[b[i]]==0) a[b[i]]=1; } else { c[m]=b[i]; m++; } flag2++; } x=x-(x/3); } int flag=1; for(int i=0;i<length;i++) if(a[i]==0) { if(flag==1) { cout<<i+1; flag=0; } else cout<<" "<<i+1; } cout<<endl; } return 0; }