素数を見つけることは、かなりよく説明されている[1] [2]ので、解決策を見つけるためにどのように考えるべきかについてもう少し説明します。そのように、将来、そのような問題を自分で解決できるようになることを願っています。
まず、ここには 2 つの問題があります。1 つの問題は、特定の数が素数であるかどうかを発見する方法であり、別の問題は、特定の範囲内のすべての素数を見つける方法です。これら 2 つは確かにリンクされています。一方のソリューションを使用して、もう一方を解決できます。それをすることから始めましょう。(これは疑似コードであり、Tcl ではありません!)
# Start at 2; 1 is defined to be a non-prime
for every i in 2 up to 100
if (isPrime i)
print i, " is prime"
else
print i, " is not prime"
end if
end for
次に、そのためのメカニズムが必要ですisPrime
。これは、名前付きサブプログラム (Tcl のプロシージャ) として作成するのが最適です。ここでは、単純な試行分割による素数性テストという最も単純な手法を使用します。
function isPrime (integer x) : boolean
# Note, when x is 2, this loop does *zero* steps
for every i in 2 up to x-1
if (x mod i = 0)
# Early exit from function; we know the answer to do more work!
return false
end if
end for
return true
end function
これは効率的ではありません (より早く停止したり、既に見つかった小さな素数のキャッシュを保持してそれらに対してのみチェックしたりすることができます) が、機能します。あとは、上記を Tcl に変換するだけです。かなり単純な 1 対 1 変換戦略があります。
しかし、重要な部分は、全体的な課題をより単純な部分に分解して、非常に単純な方法で解決できるようにすることです。
補足: Tcl では式も波括弧にする必要があります。そうしないと、高度なプログラミングで役立つ場合がありますが、ほとんどの場合、バグが発生するのを待っているだけです。組み込みコンパイラが式を高速なコードに変換できるという利点があります。