第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 だよ、と、結局は逃げてしまったのだが、実生活で使う機会はないので、理解するのは難しいだろうなぁ。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません