第20回【JavaScript】素数の個数、log2

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 20 回目です。

AWS の T シャツやらパーカーやらを制服代わりに着ています。まぁ、元々私服 OK で、しかし、毎日私服を考えるのが面倒だったので、Y シャツを制服としていただけなんですが。最近、別のメガクラウドを勉強しろ圧力が強いので、わずかばかりの抵抗と言いますか、主張をしているわけです。

それでは、今日も頑張ってみようと思います。

素数の個数 (paizaランク C 相当)

整数 N が与えられるので、2 以上 N 以下の素数の個数を求めてください。
素数とはの約数が 1 と X のみであるような整数 X のことを指します。


入力される値

N

・ 整数 N が 1 行で与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

2 以上 N 以下の素数の数を 1 行で出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 2 ≦ N ≦ 1000 (1 ≦ i ≦ N)


入力例

10

出力例

4

大好き素数。素数大好き。1000 くらいまでなら、頭の中で数えられそうだぜ。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  let cnt = 0;
  for (let i = 2; i <= n; i++) {
      let isPrime = true
      for (let j = 2; j * j <= i; j++) {
          if (i % j == 0) {
              isPrime = false;
              break;
          }
      }
      if (isPrime) cnt++;
  }
  console.log(cnt);
});
Python
N = int(input())
cnt = 0
for i in range(2,N+1):
    for j in range(2,int(i**0.5)+1):
        if i % j == 0:
            break
    else:
        cnt += 1
print(cnt)

log2 (paizaランク C 相当)

整数 N が与えられるので、1 × 2 × … × (N-1) × N を最大で何回 2 で割ることができるかを求めてください。


入力される値

N

・ 整数 N が 1 行で与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

2 で 1 * 2 * … * (N-1) * N を割ることができる最大の回数を 1 行で出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 2 ≦ N ≦ 500


入力例

10

出力例

8

for 文の中で while 文を利用するパターン。ちょっとした工夫で N の階乗を求めなくても、解を求めることが出来る問題。

JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const n = Number(lines[0]);
  let cnt = 0;
  for (let i = 1; i <= n; i++) {
      let tmp = i;
      while (tmp % 2 == 0) {
          cnt++;
          tmp = Math.trunc(tmp / 2);
      }
  }
  console.log(cnt);
});

果たして、Math.trunc() が正しいのかどうか。Number を利用して整数にするとかでも良い気がする。

Python
N = int(input())
cnt = 0
for i in range(1,N+1):
    tmp = i
    while tmp % 2 == 0:
        cnt += 1
        tmp //= 2
print(cnt)

最後に

最近、若い子に log ってなんですか。なんに使うんですか。と切れ気味に聞かれた。IPA の過去問を解いていて、どうにも理解出来なかったようだ。対数の説明をしても、チンプンカンプンって感じの顔をしている。

ものすごーく大きな数字を計算するときに便利に使えるのが log だよ、と、結局は逃げてしまったのだが、実生活で使う機会はないので、理解するのは難しいだろうなぁ。

引き続き、よろしくお願いいたします!

Python の第20回はこちら