-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],所以我将更多地解释一下你应该如何思考以找出解决方案。像这样,我希望你以后能够更好地自己回答这些问题。

首先,这里有两个问题。一个问题是如何发现一个特定的数字是否是素数,另一个问题是如何找到给定范围内的所有素数。这两者确实是联系在一起的:我们可以用一个解决方案来解决另一个问题。让我们从这样做开始。(这是伪代码,不是 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 中支持您的表达式!不这样做有时在高级编程中很有用,但它几乎总是只是一个等待发生的错误。它的好处是允许内置编译器将表达式转换为快速代码。

于 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 回答
0

此代码完美运行。它显示给定范围内的所有素数,还显示该给定范围内存在多少素数。

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"
于 2015-07-03T15:16:17.340 回答
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"
    }
}
于 2020-03-11T11:01:42.510 回答
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 
于 2016-08-26T12:13:38.493 回答
-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"
}
于 2014-06-24T08:29:01.820 回答