c++实现不断删除奇数位置到只剩最后一个

有思路写不出编程。。
原题是一百个和尚
皇帝要杀掉奇数位
一轮下来后再删掉新的奇数位
只剩下一个是幸存者

定义 int a[100]={0},然后根据下标扫描,奇数顺序的下标就把值设置为1,直到一遍扫描只有1个不为0的结束

#include <stdio.h>
void main()
{
    int a[101] = {0};
    int count =0;
    while(1)
    {
        count = 0;
        for(int i=1;i<=100;i++)
        {
            if(a[i] == 0)
                count++;
            if(count%2==1)
                a[i] = 1;
        }
        if(count <= 3)
            break;
    }
    for(int i=1;i<=100;i++)
    {
        if(a[i] == 0)
            printf("%d\n",i);
    }
}

定义数组保存数据,循环删除下标奇数的值,就是赋值为0,然后不为0的全部前移。

这种题目有2种思路:
1.每次循环把奇数位置改写为0,并把非0数字前移(可以用类似冒泡排序的算法来做,反复调用)
2.定义一个步长=2的i+1次方,一开始是2,然后是4,然后是8,这样去筛。数据不动而步长变化,效果一样,而且效率更高