第9回【JavaScript】各桁の和、カウント変数を使った計算、2 で何回割れる?、任意の数で何回割れる?

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

はじめに

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

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

コロナに 2 回感染している私が言うのもなんですが、コロナへの警戒心が薄れてきているように思います。会食も増えました。しかし、感染力と感染後の自宅待機期間を考えると、うまく付き合っていく病気、にはなかなかならないんじゃないでしょうか。

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

各桁の和 (paizaランク D 相当)

10 進数で表された整数 N が与えられます。
整数 N の各桁の和を計算し、出力してください。


入力される値

N

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

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


期待する出力

整数 N の各桁の和を計算し、出力してください。

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


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

・ 1 ≦ N ≦ 100,000


入力例

12345

出力例

15

切り捨ては floor() か trunc() か。今回は、分かりやすい trunc() を利用。

10 で割った余りが 1 の位の数値を表す。10 で割って小数点以下を切り捨てると、一桁右にずらすことが出来る。

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', () => {
  let n = lines[0];
  let ans = 0;
  while (n > 0) {
      ans += n % 10;
      n = Math.trunc(n / 10);
  }
  console.log(ans);
});
Python
N = int(input())
ans = 0
while N > 0:
    ans += N % 10
    N //= 10
print(ans)

カウント変数を使った計算 (paizaランク D 相当)

N 個の整数 M_1, M_2, …, M_N があります。
i 番目の M を M_i とするとき、M_i * i を改行区切りで出力してください。
例えば、M_5 が 3 の場合、3 * 5 = 15 となります。


入力される値

N
M_1 M_2 ... M_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に N 個の整数 M_1, M_2, …, M_N が与えられます。

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


期待する出力

i 番目の M を M_i とするとき、M_i * i を改行区切りで出力してください。

M_1 * 1
M_2 * 2
...
M_N * N

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ M_i ≦ 100 ( 1 ≦ i ≦ N )


入力例

5
1 2 3 4 5

出力例

1
4
9
16
25

インデックスが 0 から始まることに注意すれば、後は簡単なのではなかろうか。

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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  for (let i = 0; i < n; i++) {
      console.log(a[i] * (i + 1));
  }
});
Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    print((i+1)*A[i])

2 で何回割れる? (paizaランク D 相当)

整数 N が与えられます。
N が何回 2 で割れるかを求め、出力してください。


入力される値

N

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

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


期待する出力

N が何回 2 で割れるかを求め、出力してください。

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


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

・ 1 ≦ N ≦ 100


入力例

4

出力例

2

日本語の問題。例えば、10 だったら、2 で割ることが出来るのは 1 回だけ。問題文に、「割り切れる」のは何回か、って書いておいて欲しかったです。

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', () => {
  let n = lines[0];
  let cnt = 0;
  while (true) {
      if (n % 2 == 0) {
        n /= 2;
        cnt++;
      } else {
        break;
      }
  }
  console.log(cnt);
});
Python
N = int(input())
cnt = 0
while True:
    if N % 2 == 0:
        N //= 2
        cnt += 1
    else:
        break
print(cnt)

任意の数で何回割れる? (paizaランク D 相当)

整数 N, M が与えられます。
N が何回 M で割れるかを求め、出力してください。


入力される値

N M

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

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


期待する出力

N が何回 M で割れるかを求め、出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 2 ≦ M ≦ 100


入力例

4 2

出力例

2

これも、「割り切れる」回数を数えるもの。とわかれば、簡単だ。

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', () => {
  let [n,m] = lines[0].split(/\s/).map(Number);
  let cnt = 0;
  while (true) {
      if (n % m == 0) {
        n /= m;
        cnt++;
      } else {
        break;
      }
  }
  console.log(cnt);
});
Python
N,M = map(int,input().split())
cnt = 0
while True:
    if N % M == 0:
        N //= M
        cnt += 1
    else:
        break
print(cnt)

最後に

当ブログ「月とライオン」の検索ワードを見ていると、「各桁の和」で検索かけられている方がかなりいらっしゃるようです。数値を文字列で受けて、一文字ずつ分解して・・・、と、LeoSaki(旦那)が Python のときに書きましたが、やっぱり数学的にはおかしなコードだと思います。

10 で割った商や余りを上手に利用することを覚えておけば、いろんな場面で応用が利くと思いますので、是非、マスター目指してください。LeoSaki(旦那)はこれについてはお手の物です!

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

Python の第9回はこちら