素数布尔函数

问题描述 投票:0回答:5

我有以下代码,用于使用 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
i
循环中没有
for
,因此
i<=sqrt(2)
i<=sqrt(3)

我如何修改代码,使其也适用于这些值?

还有错误消息

"Control may reach end of non-void function"
。这是为什么?

谢谢。

c++ math
5个回答
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 循环,因此退出时不会显式返回任何内容,这可能会导致未定义行为)。一般来说,您希望在任何条件结构之外有一个返回指令。


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
投票

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

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

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;}

0
投票

用 C++ 编写一个程序来查找某个范围内的质数。用户必须输入程序的起始和结束范围才能显示准确的输出。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.