2036:【例5.3】开关门
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 8388 通过数: 5185
【题目描述】
宾馆里有n(2≤n≤1000)个房间,从1∼n编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
【输入】
房间数n。
【输出】
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。
分析:先设定一个数组,再遍历每个“服务员”,
#include<iostream>
//#include<iomanip>
//#include<cmath>
//#include<array>
//using std::array;
using std::cout;
using std::cin;
//using std::endl;
//using std::fixed;
//using std::setprecision;
//using std::pow;
int main()
{
int n = 0;
cin >> n;
int num = 0;
int a[1000]={};
//初始值默认为0,那么就用1代表开门,0表示关门
for (int i = 1; i <= n; ++i)//表示服务员
{
for (int j = 1; j <= n; ++j)//表示门
{
if (j % i == 0&&a[j]==0)
//满足,则说明该服务员会进行相反操作
{
a[j] = 1;
}
else if(j%i==0&&a[j]==1)
{
a[j] = 0;
}
}
}
for (int i = 1; i <= n; ++i)
{
if (a[i]==1)
{
cout << i << " ";
}
}
}