素数的bool函数

时间:2012-11-22 12:20:48

标签: c++ math

我有以下代码,用于检查前20个正数是否是使用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;
    }
}

适用于除1 to 20之外的所有数字2 and 3,其中输出为0而不是1。我想我知道为什么。对于x = 2 and 3i循环中没有fori<=sqrt(2)i<=sqrt(3)

我如何修改代码,以便它也适用于这些值?

还有一条错误消息"Control may reach end of non-void function"。这是为什么?

感谢。

4 个答案:

答案 0 :(得分: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错误消息告诉您在所有情况下你的prime函数都没有返回(当你将1传递给你的函数时,它不会进入for循环,因此没有明确退出返回任何可能导致未定义行为的东西。通常,您希望在任何条件结构之外都有返回指令。

答案 1 :(得分:4)

您在prime函数中的错误位置返回。

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

在现有功能中,您只测试第一个i。编译器警告指的是如果循环完成而不返回(尽管我们很容易看到它永远不会),然后控件将到达prime的末尾而不返回值。

答案 2 :(得分:0)

从循环中提取返回true结果!

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

答案 3 :(得分: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;}