如何打印给定范围内的所有素数? 这是我尝试过的代码,但它没有提供正确的输出:
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"
}
}
答案 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"
}