-4

特定の範囲のすべての素数を印刷するにはどうすればよいですか?これが私が試したコードですが、正しい出力が得られません:

for {set x 2} {$x<100} {incr x} {

    for {set i 2} {$i<$x} {incr i} {

        set y [expr $x % $i]
        set flag 0
        if {$y == 0}  {
            puts "$x:not a prime no"
            incr flag
            break   
        }
    }

    if {$flag ==1} {
        puts "$x: prime no"
    }
}
4

6 に答える 6

3

素数を見つけることは、かなりよく説明されている[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 では式も波括弧にする必要があります。そうしないと、高度なプログラミングで役立つ場合がありますが、ほとんどの場合、バグが発生するのを待っているだけです。組み込みコンパイラが式を高速なコードに変換できるという利点があります。

于 2012-06-06T08:34:41.003 に答える
0

Donal はすでに最良の回答を提供していますが、コードにいくつかの小さなエラーがあったことを知っておいてください。私はあなたのためにそれを片付けました。

for {set x 2} {$x<100} {incr x} {
    set flag 1
    for {set i 2} {$i<$x} {incr i} {
        set y [expr $x % $i]
        if {$y == 0}  {
            puts "$x: not a prime no"
            set flag 0
            break   
        }
    }

    if {$flag ==1} {
        puts "$x: prime no"
    }
}
于 2012-06-06T16:21:53.690 に答える