2

我有以下代码用于使用 bool 函数检查前 20 个正数是否为素数。

#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 3中没有这样or 。ifori<=sqrt(2)i<=sqrt(3)

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

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

谢谢。

4

4 回答 4

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给您的函数时,它不会进入 for 循环,因此在没有显式返回任何内容的情况下退出,这可能导致未定义的行为)。通常,您希望在任何条件结构之外都有一个返回指令。

于 2012-11-22T12:24:03.933 回答
4

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

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

在您现有的功能中,您只测试第一个i. 编译器警告指的是如果循环结束而不返回(尽管我们很容易看到它永远不会返回),那么控制将如何到达结束prime而不返回值。

于 2012-11-22T12:24:29.197 回答
0

从循环中提取返回真实结果!

bool prime( int _x )
{
    double x = sqrt( _x );
    for( int i = 2; i <= x; ++i )
        if ( !( _x % i ) )
            return false;
    return true;
}
于 2012-11-22T12:34:31.927 回答
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;}
于 2015-01-06T08:10:28.667 回答