宾馆里有n个房间,从1∼n编了号,开始都是关闭的。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n
个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
输入描述:
房间数n(2≤n≤1000)。
输出描述:
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。
示例:
输入:
100
输出:
1 4 9 16 25 36 49 64 81 100
思路:默认-1为初始关闭状态,每个服务员对门号码为人号码倍数的门做相反操作,即*-1,最后输出结果。
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int flag=1;
int arr[100000] = { 0 };
for (int i = 1; i <= n; i++)
{
arr[i] = -1;
}
for (int i = 1; i <= n; i++)//i表示门牌号
{
for (int j = 1; j <= n; j++)//j表示服务员号
{
if (i%j == 0)
{
arr[i] *= -1;
}
}
}
for (int i = 1; i <= n; i++)
{
if (arr[i] == 1)
{
if(flag==0)
{
printf(" %d", i);
}
else
{
printf("%d", i);
flag=0;
}
}
}
return 0;
}