SWUSTOJ 480: Locker doors

走廊里有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值