【题目描述】
宾馆里有n(2≤n≤1000)个房间,从1∼n编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
【输入】
房间数n。
【输出】
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。
【输入样例】
100
【输出样例】
1 4 9 16 25 36 49 64 81 100
【题目链接】
#include<stdio.h>
void find_open_doors(int n)
{
int doors[n], i, j;
// 初始化房间门的状态,0表示关闭,1表示打开
for (i = 0; i < n; i++)
doors[i] = 0;
// 模拟每个服务员的处理
for (i = 1; i <= n; i++)
{
for (j = i - 1; j < n; j += i)
doors[j] = !doors[j]; // 状态取反
}
// 输出打开的房间门编号
for (i = 0; i < n; i++)
{
if (doors[i] == 1)
printf("%d ", i + 1);
}
}
int main()
{
int n;
scanf("%d", &n);
if (n >= 2 && n <= 1000)
find_open_doors(n);
return 0;
}