概要
そのまんま、受け取った数値の素数判定を行うアクションです。
For Eachウィジェットを使わないループのサンプルとしても。
プログラムの構成
Client Action
Input Parameter
-
InputNumber
- Integer
- ユーザが入力する素数判定対象の整数値。
Output Parameter
-
IsPrimeNumber
- Boolean
- 素数判定結果。素数なら
True
、素数でないならFalse
。
Local Variable
-
LoopCount
- Integer
- Default Value:
2
- ループカウンタ。処理の最初で1までの数は弾いてしまうので開始は2になります。
解説
InputNumber<=1?
素数の定義として「2以上の自然数である」があるので、問答無用で1以下の数値はFalse
です。
このためループカウンタのDefault Valueは2になります。
LoopCount<=Sqrt(InputNumber)?
素数の主要な定義は「正の約数が 1 と自分自身のみである」です。なので、1ずつ増やして判定対象を割っていき、判定対象に辿り着くまでに割り切れる数があったらFalse
、というのが基本的な考え方です。
が、素数の性質として判定対象まで検査しなくても「判定対象の平方根」まで検査すれば判定可能というものがあります。これに従って判定条件を考えると上記になります。
Sqrt(decimal)
はOutSystemsのBuilt-in Functionで引数の平方根を返す関数です。Mathの中にあります。
Mod(InputNumber,LoopCount)=0?
実際の判定部分です。見ての通り、InputNumber
をLoopCount
で割った余りが0ならFalse
、0以外ならLoopCount
をインクリメントして処理を繰り返します。
LoopCount
がInputNumber
の平方根に届くまで繰り返して一度も割り切れなければTrue
、素数と判定します。
ここで、インクリメントした後にもう一度「LoopCount<=Sqrt(InputNumber)?
」のIfウィジェットに戻っているところが肝で、これでFor Eachウィジェットを使わないループが実現できます。