走廊里有n个储物柜,从1到n依次编号。最初,所有的储物柜门都是关闭的。你经过储物柜n次,每次都从1号储物柜开始。在第i次通过时,i=1,2。。。,n、 你拨动每个第i个储物柜的门:如果门关着,你就打开它,如果门开着,你就会关上它。例如,第一次通过后,每个门都打开了;在第二次通过时,您只拨动偶数储物柜(#2、#4…),以便在第二个通过后,偶数门关闭,奇数门打开;第三次通过你关闭3号储物柜的门(从第一次通过打开),打开6号储物柜的大门(从第二次通过关闭),以此类推。最后一次通过后,哪些储物柜的门是打开的,哪些是关闭的?其中有多少是开放的?你的任务是编写一个程序来输出最后一次通过后打开了多少扇门?假设所有的门一开始都是关着的。
输入
一个正数n,门总数。n<=100000
输出
a正数,d的总和
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
bool a[100001] = {false}; // 用 bool 类型数组表示每扇门的状态,初始状态都是 false,代表门是关闭的
for (int i = 1; i <= n; i++) { // i 记录第几次通过
for (int j = i; j <= n; j += i) { // j 记录经过的门的编号
a[j] = !a[j]; // 利用逻辑非运算符实现开关门的操作
}
}
int sum = 0;
for (int j = 1; j <= n; j++) {
sum += a[j]; // 统计打开的门的数量
}
printf("%d\n", sum);
return 0;
}