Tcl 打印范围内的所有素数

Tcl 打印范围内的所有素数,tcl,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

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

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

对于{set x 2}{$x寻找素数是一件很好的事情,因此我将进一步解释一下,为了解决这个问题,你应该如何思考。这样,我希望你将来能够更好地自己回答这些问题

首先,这里有两个问题。一个问题是如何发现一个特定的数字是否是素数,另一个问题是如何找到给定范围内的所有素数。这两个问题确实是联系在一起的:我们可以使用一个问题的解来解决另一个问题。让我们从这个问题开始。(这是伪代码,不是Tcl!)

接下来,我们需要一种机制来实现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中对表达式进行支撑!不这样做在高级编程中偶尔有用,但它几乎总是一个等待发生的错误。它的好处是允许内置编译器将表达式转换为快速代码。

Donal已经给出了最佳答案,但您知道有一个f你的代码中有一些小错误。我已经帮你整理好了

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

对于{set x 2}{$x此代码将为您提供输入的单个数字是否为素数。您可以从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"
}
放入“输入n值:”
获取stdinn
第一组1
设置计数0
而{$i这段代码工作得非常完美。
它显示给定范围内的所有素数no,也显示给定范围内存在多少素数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"
输入“输入您的范围”
获取stdinx
设置z$x
第一组1
集合j0
而{$i=2}{
如果{[expr$x%$n]==0}{
设置温度1
打破
}
增量n-1
}
如果{$temp==0}{
放置“$x是一个基本否”
增量j 1
} 
增量i 1
增量x-1
}
放入“素数的总数为$j”
用于{set x 2}{$x<100}{incr x}{

对于{seti2}{$i
对于{setx1}{$x典型的家庭作业。我特别不打算这么做。“家庭作业”问题的回答方式应该是提问者仍然需要努力;提供尽可能多的支持会减少他们所学到的东西。啊,古老的正义与仁慈问题!在这种情况下,我选择了仁慈:-)我将你的评论移到了帖子上。因此,请删除你的评论。
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"
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 
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"
    }
}