打印范围内的所有素数

时间:2012-06-05 18:10:21

标签: tcl

如何打印给定范围内的所有素数? 这是我尝试过的代码,但它没有提供正确的输出:

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"
    }
}

6 个答案:

答案 0 :(得分:3)

[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。这是一个非常简单的一对一转换策略。

重要部分是将整体挑战分解为更简单的部分,您可以通过简单易懂的方式解决这些问题。


旁注:你还应该用Tcl表达你的表达式!不这样做偶尔在高级编程中很有用,但它几乎总是等待发生的错误。它的好处是允许内置编译器将表达式转换为快速代码。

答案 1 :(得分: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"
    }
}

答案 2 :(得分:0)

此代码完美无缺。 它显示给定范围内的所有素数no,也显示在给定范围内存在多少素数。

puts "enter your range"
gets stdin x
set z $x
set i 1
set j 0 
while {$i<$z} {
set n [expr $x-1]
set temp 0
while {$n>=2} {
if {[expr $x%$n]==0} {
  set temp 1
  break
  }
  incr n -1
 }
if {$temp==0} {
puts "$x is a prime no"
incr j 1
} 
incr i 1
incr x -1
}
puts "total number of prime no  is $j"

答案 3 :(得分:0)

for {set x 2} {$x < 100} {incr x} {
    for {set i 2} {$i <= $x} {incr i} {
        set y [expr $x % $i]
        if {$y == 0} {
            if {$i == $x} {
                append prime "$x "
                break;
            } else {
                append notprime "$x "
                break;
            }
        }
    }
}

puts "\nprime : $prime\n"
puts "not prime : $notprime\n"

Output:
-----------

prime : 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

not prime : 4 6 8 9 10 12 14 15 16 18 20 21 22 24 25 26 27 28 30 32 33 34 35 36 38 39 40 42 44 45 46 48 49 50 51 52 54 55 56 57 58 60 62 63 64 65 66 68 69 70 72 74 75 76 77 78 80 81 82 84 85 86 87 88 90 91 92 93 94 95 96 98 99 

答案 4 :(得分:0)

for {set x 1} {$x<100} {incr x} {
    set flag 0
    for {set i 1} {$i<=$x} {incr i} {
        set y [expr $x % $i]
        if {$y == 0}  {
            incr flag
        }
    }

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

答案 5 :(得分:-1)

此代码将为您提供输入的单个数字是素数与否。您可以从1 ..输入并在某些代码上方执行,但我没有得到正确的输出

puts "Enter n value : "
gets stdin n
set i 1
set count 0
while {$i <= $n} {
set y [expr $n % $i]
if {$y == 0} {
incr count
incr i
} else {
incr i
}
}
if {$count == 2} {
puts "Given number is prime"
} else {
puts "Given number is not a prime"
}