digital_root


CodeWars解答


ディジタルroot問題


digital rootは、数字のすべてのビット数の再帰的な合計です.
与えられたnの数字の和をとる.この値が2桁より大きい場合は、1桁が生成されるまでこのように減少し続けます.非負の整数として入力します.
16  -->  1 + 6 = 7
942  -->  9 + 4 + 2 = 15  -->  1 + 5 = 6
132189  -->  1 + 3 + 2 + 1 + 8 + 9 = 24  -->  2 + 4 = 6
493193  -->  4 + 9 + 3 + 1 + 9 + 3 = 29  -->  2 + 9 = 11  -->  1 + 1 = 2

私の答え

function digital_root(n) {
  if (n < 10) return n;
  return n.toString().split("").reduce((a, c) => {
      a = a + Number(c);
      if (a > 9) return digital_root(a);
      return a;
    }, 0);
}
  • 買収によって伝達されたパラメータnは数字である.10未満の場合は、1桁の桁数になり、戻ります.
  • が2桁以上の場合は、その数字を桁に分けて加算します.split('')メソッドを使用すると、数値を1桁に分離し、データ型を配列に変更して、数値の順序が変わらないことを確認できます.また、配列であるため、reduce()メソッドを使用することも可能である.split()メソッドを使用するには、toString()メソッドを使用して数値データ型を文字列に変更します.
  • reduce()メソッドを使用して、
  • 配列の各数値文字を加算して値を返します.このとき、コールバック関数に加えられたaは初期値0が数字に設定され、cはデータ型が文字であるため、Number()コンストラクタを用いてデータ型を数字に変更する.
  • 加算値が10より大きい場合、上記の手順を再度繰り返す必要があるため、再帰関数法を用いて、ビット数が1桁になるまで、コールバック関数内でdigital_root関数を再度呼び出す.
  • 最終合計
  • aを返します.
  • 他人を解く

    function digital_root(n) {
      return (n - 1) % 9 + 1;
    }
    この解法を理解するためには,連合modularに関する基礎知識が必要である.△この動画リストを見ていると、連合式が理解できます.
    x≡10 x(mod 9)は正しい方法ですか?
    かもしれません.xを9で割った剰余は、xに10を乗じた後に9で割った剰余と等しい.
    x = 9q(몫) + r(나머지)
    10x = 90q + 10r
        = 9(10q + r) + r
    すなわち、数字を9で割った残りの部分は、数字の桁数の和を9で割った残りの部分に等しい.
    この問題は、上記mod 9ロジックを使用して% 9演算子を使用して解決できるようになりました.
  • の任意の数字nを受け取り、1を減算します.n % 9で実行される場合、9の数字であれば、残りの部分は0に戻るからである.(9の倍数は同じです.)この問題は1桁に達する前に桁を加算する必要があるので、9なら9を返却します.したがって,-1を除けば9の倍数は9に分けられ,残りは0ではない.
  • 1では、任意の数字から-1が減算されるので、9で除算され、+1が減算される.
  • しかし問題は「digital rootはデジタルのすべてのビット数の再帰的なマージである」ため,この解法は再帰的な方法ではない.