2013-06-05 95 views
0

這個特定的問題不涉及循環和我見過的大多數涉及循環的答案。這是我閱讀的其中一本書的挑戰。不,我不是學生(38歲),我實際上正在轉換職業,所以我決定開始學習如何編程。我正在閱讀的這本書被稱爲「C#/喬斯2優點介紹」。檢查用戶輸入的數字是否是質數

這裏是我到目前爲止的代碼。我知道使用我可能沒有很好掌握的東西的方法可能更好。例如,我知道什麼是「布爾」,但是還沒有在我的任何編碼中使用它。因此,很難實現它。

int myChoice; 
    Console.Write("Please enter a number: "); 
    myChoice = int.Parse(Console.ReadLine()); 

    if (myChoice >= 1 && myChoice % myChoice == 0) 
    { 
     Console.WriteLine("That's correct, {0} is a prime number.", myChoice); 
    } 
    else 
    { 
     Console.WriteLine("That is not a prime number."); 
    } 

    Console.ReadLine(); 

好的,你可以看到程序要求用戶輸入一個數字。正如if語句所確定的那樣,如果該數字大於或等於1,並且該數字可以被自身整除而沒有餘數,則該語句爲真。

我知道有一個更好的方法來確定輸入的數字是否是一個總數,但我無法弄清楚它是什麼。該程序做我希望它做的事情,除非弄清楚數字是否爲素數。

只是在這裏的一些背景。你在屏幕上看到的只是我對C#的瞭解程度。除了你所看到的,我可能已經失去了。

有什麼建議嗎?

+5

僅供參考,*每個*號碼(零除外)均分爲無餘數。素數的定義是數字是否只能被1和它自己整除,這意味着沒有其他*數字會將其分開。 –

+0

http://stackoverflow.com/questions/15743192/check-if-number-is-prime-number –

+0

你的程序打印任何數字作爲素數。在google上搜索如何檢查數字是否爲素數。我建議你使用僞代碼或其他語言C來執行算法,並用C#實現。 – Sunny

回答

1

還有一個非常具有挑戰性的要求來測試素數,它不能被任何其他數字除。例如4大於零且4%4 = 0。但是4不是素數,它等於2×2。

素數檢測相當困難。大多數開始的編程書籍都希望您嘗試使用Sieve of Eratosthenes,這是確定數字是否爲素數的老方法。維基頁面提出了一個算法來實現這一點。基本上,你在一個陣列產生從1到100的數字,並刪除那些誰是不是素數,讓你所有的素數從1到100

+0

有趣的是,初學者的書會要求初學者編寫一個程序,檢查用戶是否輸入了一個素數。看起來像編輯或作者的巨大監督。 –

+1

爲了實現這一目標,複雜性與語言無關,但涉及到算法的複雜性。如果它是一本允許您從C++轉換爲C#的書,那麼這是適當的。 – Eric

+1

真的,所有你需要檢查的素數是2 for循環和布爾型 – Eric

1

如果ň你的號碼是小,它是簡單的測試小於所有號碼sqrt(n)作爲除數;如果他們沒有劃分Ñ,然後Ñ是素數:

function isPrime(n) 
    d := 2 
    while d * d <= n 
     if n % d == 0 
      return Composite 
     d := d + 1 
    return Prime 

對於較大的號碼,素性的一個合理的測試是米勒羅賓測試;它可以被愚弄(錯誤地宣稱一個複合數字是素數),但可能性很低。開始用強僞素試驗:

function isStrongPseudoprime(n, a) 
    d := n - 1; s := 0 
    while d is even 
     d := d/2; s := s + 1 
    t := powerMod(a, d, n) 
    if t == 1 return ProbablyPrime 
    while s > 0 
     if t == n - 1 
      return ProbablyPrime 
     t := (t * t) % n 
     s := s - 1 
    return DefinitelyComposite 

每個一個的量,函數返回ProbablyPrime是證人到的Ñ素性;他們的測試足夠的,你獲得一些信心,ñ實際上是素數:

function isPrime(n) 
    for i from 1 to k 
     a := randint(2 .. n-1) 
     if isStrongPseudoprime(n, a) == DefinitelyComposite 
      return DefinitelyComposite 
    return ProbablyPrime 

可變ķ是要執行試驗的次數;通常在10到25之間是合理的價值。powerMod(b,e,m)函數返回b^e(mod m)。如果你的語言沒有提供該功能,可以有效地計算出它是這樣的:

function powerMod(b, e, m) 
    x := 1 
    while e > 0 
     if e % 2 == 1 
      x := (b * x) % m 
     b := (b * b) % m 
     e := floor(e/2) 
    return x 

如果你有興趣在此測試背後的數學,我謙虛地推薦文章Programming with Prime Numbers在我的博客。

相關問題