digital_root
7819 ワード
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);
}
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桁の桁数になり、戻ります.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
が減算されるので、9
で除算され、+1
が減算される.Reference
この問題について(digital_root), 我々は、より多くの情報をここで見つけました https://velog.io/@sozero/digitalrootテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol