给定一个从 1 到 n 排序的整数列表。
首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。
第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。
我们不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
返回长度为 n 的列表中,最后剩下的数字。
输入n 的数 输出最后剩下的数字
其实每步都可以知道还剩多少个数字,判断奇偶就可以每次从左到右执行的
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 0;
scanf("%d", &a);
int count = a;
int s[a];
int flag = 0;
int pos = 1;
for (int i = 0; i < a; i++)
{
s[i] = i + 1;
}
while (count > 1)
{
if (!flag)
{
pos = 1;
for (int i = 0; i < a; i++)
{
if (s[i])
{
pos++;
if (pos == 2)
{
pos = 0;
s[i] = 0;
count--;
if (count == 1)
break;
}
}
}
flag ^= 1;
}
else
{
pos = 1;
for (int i = a - 1; i >= 0; i--)
{
if (s[i])
{
pos++;
if (pos == 2)
{
pos = 0;
s[i] = 0;
count--;
if (count == 1)
break;
}
}
}
flag ^= 1;
}
}
for (int i = 0; i < a; i++)
{
if(s[i])printf("%d",s[i]);
}
};