問題を解いていて、右往曲折あってどうにか答えにたどり着くまでの流れを復習の意味でまとめています。頭の良い記事ではありませんが、数学的センスを何処かに置いてきたので解説とか読んでもよく分からないけど、バカが悩んでる様を見ると少し理解が早まるぞ!という方のお役に立てれば幸いです。数学知識は皆無(高校でやったはずですがほとんど覚えていません、、算数ができる程度です)主にJSを利用(以下の問題もJSで解いています)JSに関して初学者ではないが、リファレンスに載ってる関数を全部把握してるかと言われると微妙というレベルアルゴリズムってねーあれだよねーという感じですので、同じような人におすすめです。解きながら初歩の初歩から数学やアルゴリズムの勉強をしている最中です。サイト上でプログラミングの問題を解いていくサービスです。まで掛け算を行い、出てきた値の末尾に並ぶゼロは何個ですか?という問題です。高校生の頃、数学の教科書でぼんやり目にしたような気のする階乗というもので10!と表現するやつです。「1000!だと2568桁だからね!」という内容の注記があります。愚直に掛け算を繰り返したらすぐに桁落ちしそうです。末尾の0を削る大きい桁を捨てる(10桁まで残す事にしました)1に戻って繰り返しという処理です。これなら桁落ちもせず不要に大きな掛け算が省かれます。最初に書いたコードでは、桁の操作に正規表現を利用していましたが演算で処理をする方が断然速かったので直しています。切り出していたのですが、都度切り出す桁数を計算するよりも切り出す桁数を固定する方が処理が速かった為10桁に固定しました。codewarsにソースを提出すると、timeoutでrejectされます。『5だけ考える』ちょっとした工夫で処理が簡単になるのだろうとは思うのですがよくわかりません。分からないので、右往曲折1のコードを使って答えを書き出して並べてみます。]まず気が付くのは、5回を1セットにゼロの桁数が増えていくことです。考えると当たり前ですが、末尾をゼロにしようと思ったら5の倍数と偶数を掛ける以外にありません。割る5とは限りませんでした。と25!のところでゼロの桁数が2増えています。5に注目するという方向は間違いなさそうです。]という具合に増えていきます。25!で2桁増えることも考えると5の累乗分ゼロが増えるっぽいぞ、という事が分かりました。5桁増加となっていて間違いなさそうです。2という事で5の何乗であるかというより、元の数字を5の掛け算に分解した時に5が何回出てくるか(5で何回割れるか)で末尾ゼロの桁数を求めれそうです。コード5の倍数の数字を5で割れるまで繰り返し、割った総数を書き足していきます。}}それでも処理速度の問題まず5の倍数だけをチェックすればよいので、ループの回数が1/5になります。1ステップ毎の計算もだいぶ減っています。右往曲折1に比べて実行時間が1/10以下になったのですが、それでもcodewarsに提出するとtimeoutでrejectされます。『そもそもループしてては無理』codewarsでタイムアウトするまでの流れを見ていると、かなり大きな桁数のテストが行われています。「125!ならゼロは31桁です」と、バシッと125から直接31を導かないと無理そうです。幾つかの例(特徴的なところと一般的なところ)を並べ、これが導き出せる計算式を考えてみます。そのまま答えが出ています。