JavaScript 「369の法則」の計算と出力 2/3

前回は、天才発明家ニコラ・テスラ氏の「369の法則」と、Windows 環境ならばインストール不要で使えるプログラミング言語 JavaScript を用いた行番号と改行を表示するプログラムを紹介しました。

前回の記事:JavaScript 「369の法則」の計算と出力 1/3 | Compota-Soft-Press

https://pixabay.com/ja/photos/ニコラ-テスラ-電気-パワー-3228001/
ニコラ テスラ 電気 – Pixabayの無料写真 – Pixabay
JavaScript で行番号を表示した結果

今回は、前回作った行番号を表示するプログラムに、「369の法則」の計算式を追加します。
※OS は Windows 10、HTML を開くウェブブラウザは Chrome です。

倍加のループ

倍加のループは、数値の変数 val の初期値を設定して、for ループ内で 2 倍の値に置き換えることを繰り返すだけです。
出力用の文字列の変数 str には行番号に加えて、倍加する値を加えました。
また、太文字にする <b> </b> のタグも追加しました。
#倍加する値の後の「 -> 」は、計算式を追記する前の区切り文字列として追加しました。

<!DOCTYPE html>
<html>
<body bgcolor="#CCFF99">

<h1>倍加を繰り返す</h1>
<p id="demo">ここに計算結果が出力されます。</p>

<script>
	str = "";	// 出力する文字列の変数
	val = 1;	// 倍加する初期値
	loopCount = 33;	// 倍加を繰り返す回数
	for (i = 0; i < loopCount; i++)
	{
		str += "(" + (i + 1).toString() + ") ";	// 行番号の出力
		str += "<b>" + val.toString()  + " -> " + "</b>"; 	// 倍加する値の出力
		str += "<br>";	// 改行
		
		val = val * 2;	// 数値の倍加
	}
	// HTML の p 要素のテキストを変数 str の文字列に変更。
	document.getElementById("demo").innerHTML = str;
</script>

</body>
</html>

RepeatDoubling.html ファイルとして保存して、ダブルクリックなどでウェブブラウザで開くと以下のように1行ごとに倍加された値が表示されます。

JavaScript で倍加を繰り返す処理の出力結果

各桁の値の和を求めるループ

急に行数が増えてしまいますが、

  • 各桁の和を1桁になるまで計算する
  • その計算式を文字列として整えて出力する

以上の 2 つの処理を加えただけです。

<!DOCTYPE html>
<html>
<body bgcolor="#CCFF99">

<h1>倍加した値の各桁の和の計算を 1 桁になるまで繰り返す</h1>

<p id="demo">ここに計算結果が出力されます。</p>

<script>
	digits = [];	// 各桁の値を出力用に保持する一時的な配列
	str = "";	// 出力する文字列の変数
	val = 1;	// 倍加する初期値
	loopCount = 33;	// 倍加を繰り返す回数
	base = 10; // 基数(10進数なので 10 )
	
	for (i = 0; i < loopCount; i++)
	{
		str += "(" + (i + 1).toString() + ") ";
		str += "<b>" + val.toString()  + " -> " + "</b>"; 	// 倍加する値の出力
		tmp = val;	// 1 桁ずつ取り出すために 10 で除算する際の一時的な変数
		while (true)
		{
			sum = 0;	// 各桁の値の和
			digit = 0;	// 各桁の値
			while(tmp > 0)
			{
				digit = tmp % base;	// 剰余で 10 で割った際の余りを求めて下位 1 桁の値を得る
				digits.push(digit);	// 出力用に桁の値を配列の最後尾に追加。
				sum += digit;	// 桁の和の変数に、今取得した桁の値を加算
				tmp = Math.floor(tmp / base);	// 1 つ上位の桁の値を同様に求めるために、10 で除算。(16 ならば 6 を得たので、16 / 10 で 1 にして、次ループで 1 を得る)
			}
			tmp = sum;	// 各桁の値の和が 2 桁以上の場合は、再びその各桁の和を求めるため、桁の値を取り出すための tmp を sum に置き換えます。
			
			// 出力
			str += digits.pop().toString();
			length = digits.length;
			for (j = 1; j < length; j++)
			{
				str += " + " + digits.pop().toString();
			}
			
			if (tmp >= base)
			{
				str += " = " + sum.toString()
				str += "<b>" + " -> " + "</b>";
			}
			else
			{
				str += " = " + "<b>" + sum.toString() + "</b>" + "<br>";
				break;	// tmp ( = sum ) の各桁の和が基数(10)より小さければ1桁になったので、各桁の和を求めるループから抜けます。
			}
			
		}
		val = val * 2;	// 数値の倍加
	}
	// HTML の p 要素のテキストを変数 str の文字列に変更。
	document.getElementById("demo").innerHTML = str;
</script>

</body>
</html>

各桁の和を1桁になるまで繰り返す処理の例

25 行目の while ループが、各桁の和を 1 桁になるまで計算するメインの部分です。
詳細はプログラム内のコメントを読んでください。
以下は、その処理を具体的な数値で説明します。

例えば、4096 を例にしてみましょう。

digit = tmp % base; の % は剰余(除算の余り)を計算しています。
4096 % 10 は 10 で割った際の余りなので、 6 になります。これは下位 1 桁の値と同じです。

得られた下位 1 桁の値を、変数 sum に加算して各桁の和を求めていきます。

tmp = Math.floor(tmp / base); では 2 桁目の値を取得するために、1 桁減らす処理をしています。
4096 / 10 は 409 なので、2回目のループでは下位 1 桁目になった 9 が得られることになります。

Math.floor 関数は小数点以下の値を切り捨てる処理です。
この関数を用いないと、以下のようにでたらめな結果になってしまいます。

(1) 1 -> 1e-323 + 1e-322 + 1e-321 + 1e-320 + 1e-319 + 1e-318 + 9.999997e-318 + 1e-316 + 1e-315 + 1e-314 + 1e-313 + 1e-312 + 1e-311 + 1e-310 + 1e-309 + 1.000000000000002e-308 + 1.000000000000002e-307 + 1.0000000000000021e-306 + 1.0000000000000021e-305 + 1.0000000000000022e-304 + 1.0000000000000022e-303 + 1.0000000000000022e-302 + 1.0000000000000021e-301 + 1.0000000000000022e-300 + 1.0000000000000022e-299 + 1.0000000000000022e-298 + 1.0000000000000022e-297 + 1.0000000000000022e-296 + 1.0000000000000022e-295 + 1.0000000000000023e-294 + 1.0000000000000023e-293 + 1.0000000000000023e-292 + 1.0000000000000023e-291 + 1.0000000000000023e-290 + 1.0000000000000023e-289 + 1.0000000000000022e-288 + 1.0000000000000022e-287 + 1.0000000000000022e-286 + 1.0000000000000021e-285 + 1.0000000000000021e-284 + 1.0000000000000021e-283 + 1.0000000000000021e-282 + 1.0000000000000022e-281 + 1.0000000000000022e-280 + 1.0000000000000022e-279 + 1.0000000000000021e-278 + 1.0000000000000021e-277 + 1.000000000000002e-276 + 1.0000000000000022e-275 + 1.0000000000000021e-274 + 1.0000000000000021e-273 + 1.0000000000000022e-272 + 1.0000000000000022e-271 + 1.0000000000000021e-270 + 1.0000000000000021e-269 + 1.0000000000000021e-268 + 1.0000000000000021e-267 + 1.0000000000000022e-266 + 1.0000000000000022e-265 + 1.0000000000000022e-264 + 1.0000000000000021e-263 + 1.0000000000000021e-262 + 1.0000000000000021e-261 + 1.0000000000000021e-260 + 1.0000000000000021e-259 + 1.000000000000002e-258 + 1.000000000000002e-257 + 1.000000000000002e-256 + 1.000000000000002e-255 + 1.000000000000002e-254 + 1.000000000000002e-253 + 1.000000000000002e-252 + 1.000000000000002e-251 + 1.0000000000000019e-250 + 1.0000000000000019e-249 + 1.000000000000002e-248 + 1.000000000000002e-247 + 1.000000000000002e-246 + 1.000000000000002e-245 + 1.0000000000000019e-244 + 1.0000000000000018e-243 + 1.0000000000000018e-242 + 1.0000000000000018e-241 + 1.0000000000000018e-240 + 1.0000000000000018e-239 + 1.0000000000000017e-238 + 1.0000000000000018e-237 + 1.0000000000000018e-236 + 1.0000000000000017e-235 + 1.0000000000000016e-234 + 1.0000000000000016e-233 + 1.0000000000000016e-232 + 1.0000000000000016e-231 + 1.0000000000000015e-230 + 1.0000000000000015e-229 + 1.0000000000000015e-228 + 1.0000000000000015e-227 + 1.0000000000000014e-226 + 1.0000000000000015e-225 + 1.0000000000000015e-224 + 1.0000000000000015e-223 + 1.0000000000000014e-222 + 1.0000000000000014e-221 + 1.0000000000000014e-220 + 1.0000000000000013e-219 + 1.0000000000000013e-218 + 1.0000000000000013e-217 + 1.0000000000000013e-216 + 1.0000000000000013e-215 + 1.0000000000000014e-214 + 1.0000000000000014e-213 + 1.0000000000000014e-212 + 1.0000000000000014e-211 + 1.0000000000000014e-210 + 1.0000000000000014e-209 + 1.0000000000000014e-208 + 1.0000000000000013e-207 + 1.0000000000000013e-206 + 1.0000000000000013e-205 + 1.0000000000000012e-204 + 1.0000000000000012e-203 + 1.0000000000000012e-202 + 1.0000000000000012e-201 + 1.0000000000000013e-200 + 1.0000000000000013e-199 + 1.0000000000000012e-198 + 1.0000000000000012e-197 + 1.0000000000000012e-196 + 1.0000000000000012e-195 + 1.0000000000000012e-194 + 1.0000000000000013e-193 + 1.0000000000000013e-192 + 1.0000000000000013e-191 + 1.0000000000000013e-190 + 1.0000000000000013e-189 + 1.0000000000000012e-188 + 1.0000000000000012e-187 + 1.0000000000000011e-186 + 1.0000000000000011e-185 + 1.0000000000000011e-184 + 1.000000000000001e-183 + 1.000000000000001e-182 + 1.0000000000000011e-181 + 1.000000000000001e-180 + 1.000000000000001e-179 + 1.000000000000001e-178 + 1.000000000000001e-177 + 1.000000000000001e-176 + 1.0000000000000011e-175 + 1.0000000000000011e-174 + 1.0000000000000011e-173 + 1.0000000000000012e-172 + 1.0000000000000011e-171 + 1.000000000000001e-170 + 1.000000000000001e-169 + 1.000000000000001e-168 + 1.000000000000001e-167 + 1.000000000000001e-166 + 1.000000000000001e-165 + 1.000000000000001e-164 + 1.000000000000001e-163 + 1.0000000000000011e-162 + 1.000000000000001e-161 + 1.0000000000000011e-160 + 1.0000000000000011e-159 + 1.000000000000001e-158 + 1.000000000000001e-157 + 1.0000000000000011e-156 + 1.000000000000001e-155 + 1.0000000000000011e-154 + 1.0000000000000011e-153 + 1.0000000000000011e-152 + 1.0000000000000011e-151 + 1.0000000000000011e-150 + 1.000000000000001e-149 + 1.0000000000000012e-148 + 1.0000000000000011e-147 + 1.000000000000001e-146 + 1.000000000000001e-145 + 1.000000000000001e-144 + 1.000000000000001e-143 + 1.000000000000001e-142 + 1.0000000000000009e-141 + 1.0000000000000009e-140 + 1.000000000000001e-139 + 1.000000000000001e-138 + 1.0000000000000009e-137 + 1.000000000000001e-136 + 1.000000000000001e-135 + 1.0000000000000009e-134 + 1.0000000000000008e-133 + 1.000000000000001e-132 + 1.0000000000000009e-131 + 1.0000000000000009e-130 + 1.0000000000000009e-129 + 1.0000000000000008e-128 + 1.0000000000000008e-127 + 1.000000000000001e-126 + 1.0000000000000009e-125 + 1.000000000000001e-124 + 1.0000000000000009e-123 + 1.0000000000000009e-122 + 1.0000000000000008e-121 + 1.0000000000000008e-120 + 1.0000000000000008e-119 + 1.0000000000000009e-118 + 1.0000000000000009e-117 + 1.000000000000001e-116 + 1.000000000000001e-115 + 1.000000000000001e-114 + 1.000000000000001e-113 + 1.000000000000001e-112 + 1.000000000000001e-111 + 1.000000000000001e-110 + 1.0000000000000009e-109 + 1.000000000000001e-108 + 1.0000000000000009e-107 + 1.0000000000000009e-106 + 1.000000000000001e-105 + 1.000000000000001e-104 + 1.000000000000001e-103 + 1.000000000000001e-102 + 1.0000000000000008e-101 + 1.0000000000000008e-100 + 1.0000000000000008e-99 + 1.0000000000000008e-98 + 1.0000000000000007e-97 + 1.0000000000000007e-96 + 1.0000000000000008e-95 + 1.0000000000000008e-94 + 1.0000000000000008e-93 + 1.0000000000000007e-92 + 1.0000000000000007e-91 + 1.0000000000000006e-90 + 1.0000000000000006e-89 + 1.0000000000000006e-88 + 1.0000000000000006e-87 + 1.0000000000000006e-86 + 1.0000000000000005e-85 + 1.0000000000000006e-84 + 1.0000000000000006e-83 + 1.0000000000000005e-82 + 1.0000000000000005e-81 + 1.0000000000000005e-80 + 1.0000000000000004e-79 + 1.0000000000000005e-78 + 1.0000000000000005e-77 + 1.0000000000000005e-76 + 1.0000000000000006e-75 + 1.0000000000000005e-74 + 1.0000000000000005e-73 + 1.0000000000000005e-72 + 1.0000000000000005e-71 + 1.0000000000000005e-70 + 1.0000000000000005e-69 + 1.0000000000000005e-68 + 1.0000000000000004e-67 + 1.0000000000000005e-66 + 1.0000000000000006e-65 + 1.0000000000000005e-64 + 1.0000000000000005e-63 + 1.0000000000000005e-62 + 1.0000000000000006e-61 + 1.0000000000000005e-60 + 1.0000000000000005e-59 + 1.0000000000000004e-58 + 1.0000000000000004e-57 + 1.0000000000000004e-56 + 1.0000000000000004e-55 + 1.0000000000000003e-54 + 1.0000000000000004e-53 + 1.0000000000000004e-52 + 1.0000000000000003e-51 + 1.0000000000000004e-50 + 1.0000000000000003e-49 + 1.0000000000000003e-48 + 1.0000000000000002e-47 + 1.0000000000000002e-46 + 1.0000000000000003e-45 + 1.0000000000000003e-44 + 1.0000000000000003e-43 + 1.0000000000000004e-42 + 1.0000000000000004e-41 + 1.0000000000000003e-40 + 1.0000000000000004e-39 + 1.0000000000000005e-38 + 1.0000000000000005e-37 + 1.0000000000000004e-36 + 1.0000000000000004e-35 + 1.0000000000000004e-34 + 1.0000000000000004e-33 + 1.0000000000000003e-32 + 1.0000000000000003e-31 + 1.0000000000000003e-30 + 1.0000000000000002e-29 + 1.0000000000000002e-28 + 1.0000000000000002e-27 + 1.0000000000000002e-26 + 1.0000000000000002e-25 + 1.0000000000000001e-24 + 1.0000000000000001e-23 + 1e-22 + 1.0000000000000001e-21 + 1.0000000000000001e-20 + 1.0000000000000001e-19 + 1e-18 + 1e-17 + 1.0000000000000001e-16 + 1e-15 + 1.0000000000000002e-14 + 1.0000000000000002e-13 + 1.0000000000000002e-12 + 1.0000000000000003e-11 + 1.0000000000000003e-10 + 1.0000000000000003e-9 + 1.0000000000000002e-8 + 1.0000000000000002e-7 + 0.0000010000000000000002 + 0.00001 + 0.0001 + 0.001 + 0.01 + 0.1 = 1.1111111111111112

計算式の出力の手順

桁の和を求めるループの後に、変数 str に桁の和の計算式を文字列として追加しています。
前述のとおり、桁の和は下位1桁から順に変数 sum に加算されますが、ユーザに見せる場合は、上位の桁から順に 4 + 0 + 9 + 6 = 19 と表示したほうが自然です。

そこで、一度全ての桁の値を配列変数 digits.push 関数で格納しておくことにしました。
push 関数は、その配列の最後尾に引数の要素を追加します。
桁の和を求めるループ処理で、tmp が 4096 の場合は、以下のように下位が配列の最初の要素になり、最上位の桁が最後の要素になります。

 N周目

配列
要素番号
1周目2周目3周目4周目
06666
1999
200
34
4096 を例とした各桁の和の計算の際の digits 配列の変化

これを、4 + 0 + 9 + 6 の文字列として出力するために、 digits 配列の最後の要素から最初の要素へ向かって要素を取得します。
digits.pop 関数は最後の要素を取り出すので、これを用いて最上位の桁から順番に取り出してそれを文字列変数 str に追加していきます。
※pop を 1 回すると要素が 1 個取り除かれるので、配列の長さ length も 1 減ります。

 N回目

配列
要素番号
1回目2回目3回目4回目
0666(6)
199(9)
20(0)
3(4)
4096 を例とした digits.pop の例。()は取り除かれる要素。

これにより、各桁の値を取得した時とは逆に、上位の桁から計算式の文字列を出力できます。

テスト

上記の SumOfDigitsOfDoubledNumber.html ファイルを保存して、ダブルクリックなどでウェブブラウザで開くと、以下のように倍加する値の各桁の和を 1 桁になるまで繰り返し計算した結果が出力されます。

JavaScript 倍加した値の各桁の和を 1 桁になるまで繰り返す処理の出力結果

前回紹介した「369の法則」の通り、3, 6, 9 の倍数ではない場合、計算結果は 1, 2, 4, 8, 7, 5 を繰り返し、 3, 6, 9 は現れません。

今回はここまで

今回は、天才発明家ニコラ・テスラ氏の「369の法則」の計算式を、Windows 環境ならばインストール不要で使えるプログラミング言語 JavaScript で作成して実行した例を紹介しました。
各桁の和を計算する処理や、その計算式を文字列として整形するための配列変数を用いた実装例やその際の配列の変化についても説明しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました