题目描述 某个监狱有一排牢房,共n间,一间挨一间。每间牢房关着一名囚犯,牢房的门都是锁着的。 有一天晚上,狱卒很无聊,决定玩一个游戏。游戏的第1轮,他喝了一杯威士忌,然后把所有牢房的门都打开了;第2轮,他又喝了一杯,然后沿着监狱,把编号为2,4,6,8,……的牢房门锁上;第3轮,他又喝了一杯,然后对编号为3的倍数的牢房进行如下操作:若门开着,则锁上,否则打开;……,狱卒重复游戏n轮。游戏结束后,他喝下最后一杯,醉倒了。 这时,有些囚犯(可能为0个)意识到他们牢房的门可能是开着的,而且狱卒醉倒了,可以立即越狱了。 给定牢房的数目,求越狱的人数。 输入 输入文件的第1行为一个正整数,表示测试数据的组数。每个测试数据占一行,为一个整数n,5 <= n <= 100,表示牢房的数目。 输出 对每组测试数据输出越狱的人数。 样例输入 复制 2 5 100 样例输出 复制 2 10 用C语言解答
时间: 2023-09-25 22:11:59 浏览: 51
```c
#include <stdio.h>
#include <stdbool.h>
int main() {
int T;
scanf("%d", &T); // 输入测试用例数量
while (T--) {
int n;
scanf("%d", &n); // 输入牢房的数量
bool cells[n]; // 定义一个数组表示牢房的状态,true 表示开着的门,false 表示关着的门
for (int i = 0; i < n; i++) {
cells[i] = false; // 初始化所有的门都是关着的
}
for (int i = 1; i <= n; i++) { // 按照题目描述的操作进行处理
for (int j = i - 1; j < n; j += i) {
cells[j] = !cells[j];
}
}
int count = 0; // 统计越狱的人数
for (int i = 0; i < n; i++) {
if (cells[i]) {
count++;
}
}
printf("%d\n", count); // 输出越狱的人数
}
return 0;
}
```