在 JavaScript 中开关灯泡
问题
考虑以下情况:
最初有 n 个灯泡处于关闭状态。我们首先打开所有灯泡。然后,我们关闭每第二个灯泡。在第三轮中,我们切换每个第三个灯泡(如果关闭则打开,如果打开则关闭)。
一般来说,对于第 i 轮,我们切换每个第 i 个灯泡。最后,对于第 n 轮,我们只切换最后一个灯泡。
我们需要编写一个 JavaScript 函数,它只接受 n 作为输入,并找出 n 轮之后有多少个灯泡是打开的。
例如,如果函数的输入是:
const n = 4;
那么输出应该是:
const output = 2;
输出解释
在状态数组中,0 表示关闭,1 表示打开:
轮次 | 状态 |
---|---|
1 | [1, 1, 1, 1, 1] |
2 | [1, 0, 1, 0, 1] |
3 | [1, 0, 0, 0, 1] |
4 | [1, 0, 0, 1, 1] |
5 | [1, 0, 0, 1, 0] |
因此,第五轮之后只有两个灯泡是打开的。
示例
代码如下:
const n = 5; const findOn = (n = 1) => { let off = 0; let on = n; while(off <= on){ let mid = Math.floor((off + on) / 2); if(mid * mid > n){ on = mid - 1; }else{ off = mid + 1; }; }; return Math.floor(on); }; console.log(findOn(n));
输出
控制台输出:
2
广告