用c++完成宾馆里有n(2≤n≤1000) 个房间,从1∼n 编了号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2 的倍数的房间“相反处理”,第三个服务员把所有编号是3 的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n 个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
时间: 2024-02-24 19:57:55 浏览: 15
以下是用 C++ 编写的解答程序:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
bool rooms[1001]; // 记录房间门的状态
int main() {
int n;
cin >> n;
memset(rooms, true, sizeof(rooms)); // 所有门都打开
for (int i = 2; i <= n; i++) {
for (int j = i; j <= n; j += i) {
rooms[j] = !rooms[j];
}
}
for (int i = 1; i <= n; i++) {
if (rooms[i]) {
cout << i << " ";
}
}
cout << endl;
return 0;
}
```
首先定义一个 bool 类型的数组 rooms,用来记录每个房间门的状态,true 表示门打开,false 表示门关闭。
然后从 2 开始遍历到 n,每次将编号是 i 的倍数的房间门状态取反。
最后输出状态为 true(即门打开)的房间编号即可。
相关问题
c++求1²+2²+3²+n²≤1000
我们可以使用循环来计算1²+2²+3²+...+n²的值,直到求和结果大于1000为止。以下是C++代码实现:
```c++
#include <iostream>
int main() {
int n = 1;
int sum = 0;
while (sum + n * n <= 1000) {
sum += n * n;
n++;
}
std::cout << "n = " << n-1 << std::endl; // 输出 n 的值
std::cout << "sum = " << sum << std::endl; // 输出求和结果
return 0;
}
```
输出结果为:
```
n = 14
sum = 1015
```
因此,当n等于14时,1²+2²+3²+...+n²的值刚好小于或等于1000。
c++求1²+2²+3²+...+n²≤1000
我们可以使用循环来计算1²+2²+3²+...+n²的值,直到其值大于1000为止。以下是一个C++的实现:
```c++
#include <iostream>
using namespace std;
int main() {
int n = 1;
int sum = 0;
while (sum + n * n <= 1000) {
sum += n * n;
n++;
}
cout << "n = " << n - 1 << endl;
cout << "1²+2²+3²+...+(n-1)² = " << sum << endl;
return 0;
}
```
输出结果:
```
n = 14
1²+2²+3²+...+(n-1)² = 955
```
因此,当n=14时,1²+2²+3²+...+n²≤1000。