2036:【例5.3】开关门

2036:【例5.3】开关门

时间限制: 1000 ms 内存限制: 65536 KB
提交数:86557 通过数: 56327
【题目描述】
宾馆里有n(2≤n≤1000)
个房间,从1∼n
编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2
的倍数的房间“相反处理”,第三个服务员把所有编号是3
的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n
个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)

【输入】
房间数n

【输出】
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。

【输入样例】
100
【输出样例】
1 4 9 16 25 36 49 64 81 100

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,num=0,j=2;        
    bool door[1001];//或者就是赋值0,1,但不如bool好用
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        door[i]=true;//模拟第一位服务员
    }
    for(int i=2;i<=n;i++)
    {
        for(int j=i;j<=n;j+=i)//必须用双重for循环第一重为第几位服务员,第二for循环为了进行该服务员的操作
        {
            door[j]=!door[j];//取反操作
        }

    }
    bool first=true;
    for(int i=1;i<=n;i++)
    {
        if(door[i])
        {
            if(!first)
            {
                cout<<" ";
            }
        cout<<i;
        first=false;//除第一次不用空格其余都在前加空格
        }
    }
    return 0;
}

计算机算法本质还是对实际问题的模拟操作!

posted @ 2025-11-10 19:05  崩溃的小孙  阅读(26)  评论(0)    收藏  举报