测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A37147. 开关/门某校有N间教室,且每间教室有2扇门,一共有2 ×N 扇门,每扇门都有编号,分别从1到 2×N 。开始时,所有门为关闭状态。现在按照以下规则对门进行处理:第一次,将所有门打开。第二次,将所有编号为2的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。第三次,将所有编号为3的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。……第N次,将所有编号为N的倍数的门作相…

填空题 困难

题目描述

开关/门

某校有N间教室,且每间教室有2扇门,一共有2 ×N 扇门,每扇门都有编号,分别从1到 2×N 。

开始时,所有门为关闭状态。现在按照以下规则对门进行处理:

第一次,将所有门打开。

第二次,将所有编号为2的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

第三次,将所有编号为3的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

……

第N次,将所有编号为N的倍数的门作相反的处理(原来是打开的就关闭,原来是关闭的就打开)。

问第N次处理后,有多少扇门为打开状态?

输入格式

输入一个正整数 N (2 ≤ N ≤100) ,代表有 NN 间教室。

输出格式

按照规则对门进行 N次处理之后,计算有多少扇门为打开状态并输出。

样例输入

2

样例输出

2

样例解释

N=2 ,每间教室有 2扇门,一共有 4扇门,门编号分别为 1 , 2 , 3 , 4 。

初始状态:四扇门都为关闭状态。

第一次,将四扇门全部打开。

第二次,将编号为 2 的倍数的门作相反的处理,即将 2 号门和 4 号门关闭。

经过两次处理之后,共有 2 扇门为打开状态。

参考答案

#include <iostream> using namespace std; int main() { int N; cin >> N; // 初始化所有门的状态为关闭 bool doors[2 * N]; for (int i = 0; i < 2 * N; i++) { doors[i] = false; } // 按照规则进行N次处理 for (int i = 1; i <= N; i++) { for (int j = i - 1; j < 2 * N; j += i) { doors[j] = !doors[j]; } } // 统计打开的门的数量 int count = 0; for (int i = 0; i < 2 * N; i++) { if (doors[i]) { count++; } } // 输出结果 cout << count << endl; return 0; }

答案解析

#include <bits/stdc++.h>

    using namespace std;

int n, ans = 0;

bool d[205];

int main() {

scanf("%d", &n);

  for (int i = 1; i <= n; i++) {

    for (int j = 1; j <= 2 * n; j++) {

      if (j % i)

        continue;

      d[j] = !d[j];

    }

  }

  for (int i = 1; i <= 2 * n; i++) {

    if (d[i])

      ans++;

    // printf("%d ", d[i]);

  }

  printf("%d\n", ans);

  return 0;

}

上一题 下一题