我有以下代码,用于检查前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 3
,i
循环中没有for
,i<=sqrt(2)
或i<=sqrt(3)
。
我如何修改代码,以便它也适用于这些值?
还有一条错误消息"Control may reach end of non-void function"
。这是为什么?
感谢。
答案 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;}