法1

这是一个经典的问题,通常被称为“开关问题”或“灯泡问题”。这个问题的解决方案是找出1到n之间所有的完全平方数,因为只有完全平方数的因数是奇数个。以下是使用C++解决这个问题的代码:

#include<iostream> #include<cmath> using namespace std; int main() { int n;
    cin >> n; for(int i = 1; i * i <= n; i++) {
        cout << i * i; if((i + 1) * (i + 1) <= n) {
            cout << " ";
        }
    } return 0;
}

在这段代码中,我们首先读取房间的数量n。然后,我们使用一个for循环从1遍历到sqrt(n),并打印出所有的完全平方数。如果下一个完全平方数仍然小于或等于n,我们就在当前的完全平方数后面打印一个空格。最后,我们返回0表示程序正常结束。这段代码的时间复杂度是O(sqrt(n)),可以在短时间内处理大量的数据。希望这个答案对你有所帮助!

法2

分析:先设定一个数组,再遍历每个“服务员”,

   

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