本ページには広告が含まれています。
引数に指定した配列の最小公倍数(Least Common Multiple)を求めます。
- 構文
- Double = LCM( array )
- 引数
- array 必須
- 最小公倍数を求める数値を格納した配列
- 戻り値
- 最小公倍数
プログラム
//////////////////////////////////////////////////
// 【引数】
// array : 最小公倍数を求める数値を格納した配列
// 【戻り値】
// 最小公倍数
//////////////////////////////////////////////////
FUNCTION LCM(array[])
DIM c = LENGTH(array)
DIM array2[] = array[c-1], array[c-2]
DIM rem = array[c-1] * array[c-2] / GCD(array2)
IFB c = 2 THEN
RESULT = rem
EXIT
ENDIF
array[c-2] = rem
RESIZE(array, c-2)
RESULT = LCM(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 最大公約数を求める数値を格納した配列
// 【戻り値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(array[])
DIM c = LENGTH(array)
DIM rem = array[c-1] MOD array[c-2]
IFB rem = 0 THEN
IFB LENGTH(array) = 2 THEN
RESULT = array[c-2]
EXIT
ENDIF
RESIZE(array, c-2)
RESULT = GCD(array)
EXIT
ENDIF
array[c-1] = array[c-2]
array[c-2] = rem
RESULT = GCD(array)
FEND
解説
- 2行目
- arrayの要素数を変数cに代入。
DIM c = LENGTH(array)
- 3行目
- 配列arrayのc-1番目とc-2番目を格納した配列array2を生成。
DIM array2[] = array[c-1], array[c-2]
- 4行目
- 配列arrayのc-1番目とc-2番目の積をarray2の最大公約数で割り、その結果を変数remに代入。
DIM rem = array[c-1] * array[c-2] / GCD(array2)
- 5-8行目
- cが2ならremを戻り値として返し終了する。
IFB c = 2 THEN RESULT = rem EXIT ENDIF
- 9行目
- 配列arrayのc-2番目にremを代入。
array[c-2] = rem
- 10行目
- 配列arrayのサイズをc-2に変更する。
RESIZE(array, c-2)
- 11行目
- LCM関数を再帰呼び出し。
RESULT = LCM(array)
最小公倍数
2つ以上の正の整数についてそのどれもが割り切れる整数(倍数)を初めの整数の公倍数といい、公倍数のなかで0ではない最小の数を最小公倍数といいます。
2つの自然数\(a\),\(b\)の最大公約数をGCD、最小公倍数をLCMとすると以下の関係が成り立ちます。
POINT
\[LCM(a, b) = \frac{a \times b}{GCD(a, b)}\]
最大公約数GCDはユークリッドの互除法を使うことで求めることができます。GCD関数 (自作関数)を参照してください。
プログラム実行例
最小公倍数を求めます
3と8の最小公倍数を求めます。
DIM array[] = 3, 8
PRINT LCM(array)
//////////////////////////////////////////////////
// 【引数】
// array : 最大公約数を求める数値を格納した配列
// 【戻り値】
// 最大公約数
//////////////////////////////////////////////////
FUNCTION GCD(array[])
DIM c = LENGTH(array)
DIM rem = array[c-1] MOD array[c-2]
IFB rem = 0 THEN
IFB LENGTH(array) = 2 THEN
RESULT = array[c-2]
EXIT
ENDIF
RESIZE(array, c-2)
RESULT = GCD(array)
EXIT
ENDIF
array[c-1] = array[c-2]
array[c-2] = rem
RESULT = GCD(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// array : 最小公倍数を求める数値を格納した配列
// 【戻り値】
// 最小公倍数
//////////////////////////////////////////////////
FUNCTION LCM(array[])
DIM c = LENGTH(array)
DIM array2[] = array[c-1], array[c-2]
DIM rem = array[c-1] * array[c-2] / GCD(array2)
IFB c = 2 THEN
RESULT = rem
EXIT
ENDIF
array[c-2] = rem
RESIZE(array, c-2)
RESULT = LCM(array)
FEND
結果
24
使用関数
解説
関連記事
- ABS関数 (スクリプト関数)
- 引数の絶対値を求めます。
- ARCCOS関数 (スクリプト関数)
- 引数の逆余弦を求めます。
- CEIL関数 (スクリプト関数)
- 正の方向へ切り上げた数値を返します。
- LN関数 (スクリプト関数)
- 自然対数を求めます。
- LOGN関数 (スクリプト関数)
- 常用対数を求めます。
- ZCUT関数 (スクリプト関数)
- マイナス値を0にして返します。プラス値はそのままの値を返します。
- isOdd関数 (自作関数)
- 引数に指定した数値が奇数かどうかを調べます。奇数ならばTrue、それ以外の数値はFalse、文字列はエラー値を返します。
- radToDeg関数 (自作関数)
- 弧度法(Radian)を度数法(Degree)に変換します。度数法を弧度法に変換するにはDegToRad関数を使います。
- ARCSIN関数 (スクリプト関数)
- 引数の逆正弦を求めます。
- EXP関数 (スクリプト関数)
- 自然指数関数を求めます。