JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】各桁の冪乗和が元の数値の整数倍になる整数kを求める方法

問題の概要

正の整数 n(各桁を a、b、c、d…と表記)と正の整数 p を引数として受け取り、次の条件を満たす正の整数 k を求めるJavaScript関数を作成します。

  • n の各桁を、p から始まる連続する指数で累乗した値の総和が、k × n と等しくなること。

数式で表すと以下のとおりです。

(a ^ p + b ^ (p+1) + c ^ (p+2) + d ^ (p+3) + …) = n × k

条件を満たす k が存在すればその値を返し、存在しない場合は -1 を返します。

解法のアプローチ

  1. 数値を文字列に変換して桁に分解する ― String() を使えば、各桁に簡単にアクセスできます。
  2. 各桁を順に累乗して合計する ― 1桁目は p 乗、2桁目は p+1 乗、3桁目は p+2 乗というように、指数を1ずつ増やしながら累乗和を計算します。
  3. 合計を n で割って k を判定する ― 割り切れた場合はその商が k、割り切れない場合は -1 を返します。

実装コード

const num = 695;
const p = 2;

const findDesiredNumber = (num, p) => {
  let sum = 0;
  const str = String(num);

  // 各桁を p, p+1, p+2 ... 乗して合計を求める
  for (const char of str) {
    sum += Number(char) ** p;
    p++;
  }

  // 累乗和が num の整数倍なら商(= k)を返す
  return Number.isInteger(sum / num) ? sum / num : -1;
};

console.log(findDesiredNumber(num, p));

実行結果

2

コードの解説

入力値 num = 695、p = 2 の場合、処理は次のように進みます。

6² + 9³ + 5⁴ = 36 + 729 + 625 = 1390

1390 ÷ 695 = 2 となり割り切れるため、関数は k = 2 を返します。

べき乗演算子 ** を使う点に注意

この種の問題でよくあるミスが、べき乗(**)と掛け算(*)の混同です。例えば sum += str[char] * p; のように書いてしまうと、各桁を指数乗する代わりに p 倍するだけになってしまい、誤った結果(上記の例では -1)が返されます。必ず ** 演算子か Math.pow() を使用してください。

for...of で各桁を直接取得する

文字列に対して for...in を使うと取得できるのはインデックス(文字列型)であるため、そのまま数値演算には不向きです。for...of を使えば各文字=各桁を直接扱えるため、コードが簡潔になり、予期しないバグも防げます。

  1. JavaScriptで入力値が数字か文字かを判定する方法【isNaN()関数の使い方】

    入力された値が数字か文字(数値以外)かを判定するには、JavaScriptのisNaN()関数を使用します。この関数は、値がNaN(Not a Number:非数)である場合にtrueを返します。この特性を利用することで、ユーザーが入力した値が数値かどうかを簡単にチェックできます。 isNaN()関数とは isNaN()は「is Not a Number」の略称です。引数として渡された値が数値として解釈できない場合にtrueを、数値として解釈できる場合はfalseを返します。これにより、「入力内容が数字かどうか」をシンプルに判定できるのが特徴です。 サンプルコード 以下のコードでは、フォームの

  2. JavaScriptで数値が三角数かどうかを判定する方法

    三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正