c++幸运小鸡 平方数

(2 )有 2022 只小鸡参加“幸
运小鸡”活动, 规定所有小鸡
排成 一排, 每一轮从排头的小
鸡开始, “1、2、3 …”这样报
数下去,报完后, 报到平方数
的小鸡被淘汰出局, 这样为一
轮。剩下的小鸡又从排头开
始, 按照“1、2、3 … ” 进
行新的一轮报数,然后淘汰报
平方数的鸡, 如此进行下去,
最后剩下的一只小鸡获得“幸
运小鸡”称号。那么“幸运小
鸡”在第一轮报的数是多少
号?

#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    vector<int> v;
    for(int i=1; i<=2022; i++)
        v.push_back(i);
    while(v.size() > 1)
        for(int i=__builtin_sqrt(v.size()); i>0; i--)
            v.erase(v.begin() + (i * i - 1));
    cout << v[0] << endl;
    return 0;
}

输出:1981。

1981

const int n = 2023;
    int a[n];
    for (int i = 0; i < n; i++)//赋值1-2022
    {
        a[i] = i;
    }
    for (int i = 1; i < n; i++)
    {
        int sum = 0;
        for (int j = 1; j < n; j++)//除去平方数,重新赋值
        {
            if (a[j] != 0)
            {
                sum++;
                a[j] = sum;
            }
        }
        if (sum <= 1)//剩余一个时返回
        {
            for (int j = 1; j < n; j++)//获取剩余的最初位置
            {
                if (a[j] != 0)
                {
                    cout << j;
                }
            }
            break;
        }
        for (int j = 1; j < n; j++)//判断平方数
        {
            if (pingfang(a[j]))//除去该数
            {
                a[j] = 0;
            }
        }
    }
bool pingfang(int a)//函数
{
    for (int i = 0; i < 50; i++)
    {
        if (i * i == a)
        {
            return true;
        }
        if (i * i > a)
        {
            return false;
        }
    }
    return false;
}

img

#include <iostream>
using namespace std;
int main() {
    int n = 2022; // 小鸡总数
    int cnt = 0; // 记录已经淘汰的小鸡数
    for (int i = 2; i <= n; i++) {
        int m = i * i; // 平方数
        cnt += m - 1; // 每次淘汰 m-1 只小鸡
        n -= m - 1; // 剩余小鸡数减去淘汰的数目
    }
    cout << n << endl; // 输出最后剩下的小鸡编号
    return 0;
}

最后的结果是:

282