2012-06-05 142 views
-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" 
    } 
} 
+2

典型的功課。 [中平凡googleable](http://rosettacode.org/wiki/Sieve_of_Eratosthenes#Tcl) – kostix

+0

http://rosettacode.org/wiki/Primality_by_trial_division#Tcl –

回答

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中支持您的表達式!不這樣做的是偶爾在高級編程中很有用,但它幾乎總是隻是一個等待發生的錯誤。它具有允許內置編譯器將表達式轉換爲快速代碼的好處。

0

多納爾已經給出了最好的答案,只是讓你知道有代碼中的一些小錯誤。我已經爲你整理過了。

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

我是專門_not_要做到這一點。 「家庭作業」問題應該以提問者仍然需要處理的方式來回答;提供儘可能多的支持的行爲減少了他們學習的內容。 –

+0

啊,老的正義與憐憫的問題!在這種情況下,我選擇了憐憫:-) – TrojanName

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

我將您的評論移至帖子。所以,請刪除您的評論。 – reporter

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" 
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 
+0

此代碼完美工作 – Krishna