2012-11-22 116 views
2

我有以下代碼用於檢查前20個正數是否使用bool函數爲素數。質數的bool函數

#include <iostream> 
#include <cmath> 
using namespace std; 

bool prime(int); 
/* 
function to evaluate whether a positive integer is prime (true) 
or not prime (false) 
*/ 
int main() 
{ 
    for(int x=1; x<=20; x++) 
    { 
     cout << x << " a prime ? (1 yes, 0 no) " 
      << prime(x) << endl; 
    } 
    return 0; 
} 

bool prime(int x) 
{ 
    for(int i=2; i<= sqrt(x); i++) 
    { 
     if ((x%i) != 0) 
      return true; 
     else 
      return false; 
    } 
} 

它適用於從2 and 3所有號碼1 to 20除了在輸出爲0,而不是1。我想我知道爲什麼。對於x = 2 and 3for迴路中沒有i,因此i<=sqrt(2)i<=sqrt(3)

我該如何修改代碼才能使用這些值?

此外還有一個錯誤消息"Control may reach end of non-void function"。爲什麼是這樣?

謝謝。

+0

對於印刷purpuse,您可以添加修改[性病:: boolalpha(HTTP://en.cppreference。 com/w/cpp/io/manip/boolalpha)輸出到輸出行,以純文本形式輸出布爾值。 'cout << x <<「a prime?」<< std :: boolapha << prime(x)<< endl;' – tomahh

回答

9

修改您的主要功能爲以下

bool prime(int x) 
{ 
    if (x < 2) return false; 
    for(int i=2; i<= sqrt(x); i++) { 
    if ((x%i) == 0) return false; 
    } 
    return true; 
} 

Control may reach end of non-void function錯誤消息告訴你,你的主要功能並非在所有情況下都返回(當你通過1給你的函數,它不會在去循環,所以退出時沒有顯式返回任何東西,這可能導致未定義的行爲)。一般來說,你想在任何條件結構之外有一個返回指令。

+0

謝謝。我發現這個錯誤信息隨着這段代碼而消失。不幸的是x = 1輸出1(一個素數);我想要1輸出0(不是素數)。也許你必須分別考慮x = 1的情況。 –

+0

@SamForbes和'x = 0',和'x = -1',...也是。只有1以上的整數纔是主要的。 –

+0

@SamForbes我編輯我的答案匹配0和1例。 – tomahh

4

您在prime函數中返回錯誤位置。

bool prime(int x) { 
    for(int i=2; i<= sqrt(x); i++) { 
     if ((x%i) == 0) 
      return false; 
    } 
    return true; 
} 

在您現有的功能中,您只能測試第一個i。編譯器警告指的是如果循環完成而不返回(儘管這很容易讓我們看到它永遠不會),那麼控制將在不返回值的情況下到達prime的末尾。

+0

謝謝。它應該在'if((x%i)!= 0)之後'返回true;'並且返回false。我使用了這段代碼,但它似乎給出了1到20之間的許多值的錯誤輸出。我不知道爲什麼我會認爲它相當於@Tom Ahh –

+0

他正確地將條件修改爲'==',並且我沒有注意到這種情況也是錯誤的。 – Puppy

0

從循環中提取真正的結果!

bool prime(int _x) 
{ 
    double x = sqrt(_x); 
    for(int i = 2; i <= x; ++i) 
     if (!(_x % i)) 
      return false; 
    return true; 
} 
+1

請不要只爲您的答案提供代碼。 –

0

,你也可以使用此而不需要sqrt函數,它就在那裏

bool prime (int num){ 
int i,temp; 
for (i=2; i<=num/2) && temp; i++) 
if (num%i==0) 
temp = 0; 
return temp;}