(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;
}
#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