我遇到了这个C ++代码的问题。整数num
是我要检查它是否为素数的数字。但是这个程序总是返回false。它可能很简单但我找不到任何东西。
for(int i=2;i<num;i++){ //primes are allowed to be divided by 1 so we start at 2
if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out
return false;
} else if(i == num){ //if we've already done checks as high as possible and not tripped out yet then report success
return true;
}
}
答案 0 :(得分:7)
i == num
将永远不会发生,因为您的循环条件为i<num
。尝试:
for(int i=2;i<num;i++){ //primes are allowed to be divided by 1 so we start at 2
if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out
return false;
} else if(i == num-1){ //if we've already done checks as high as possible and not tripped out yet then report success
return true;
}
}
如下所述,此处的else
条件是多余的,您只需要检查2到sqrt(num)
- 因为已经检查了其余因素。
根据您想要解决问题的复杂程度,可以进行更多改进。实际上大多数方法都使用概率算法。
答案 1 :(得分:4)
您不必检查每个号码,因为很多号码都可以轻易排除。例如,在检查num
不能被2
整除后,您可以跳过所有其他偶数。这样可以节省一半的测试时间。
我们也明确知道任何其他因素必须小于num/2
(或真正sqrt(num)
,但这更难计算)。这些知识可以为我们节省另外一半的测试。
现在我们有:
if (num % 2 == 0)
return false;
for(int i = 3; i < num / 2; i += 2){
if(num % i == 0){ //can be divided by a number other than itself or 1 so we trip out
return false;
}
}
// arriving here we have found no factors, so it must be a prime
return true;
答案 2 :(得分:1)
bool CheckPrime(int num) {
bool yayornay = true;
for(int i = 2; i < num; i++) {
if(num % i == 0) {
yayornay = false;
break;
}
}
return yayornay;
}
答案 3 :(得分:1)
Will Ness代码的一个小优化,只计算for之外的数字的sqrt。条件检查执行多次,没有意义每次计算sqrt。
if( num == 2 ) return true;
if( num < 2 || num % 2 == 0 ) return false;
int sqrt = sqrt(num);
for( int i=3; i<=sqrt; i+=2 ){
if(num % i == 0){
return false;
}
}
return true;
到目前为止,我认为这是最有效的方式!
答案 4 :(得分:0)
这是写出你的意思的正确方法:
int i=2; // move declaration out
for(/*int i=2*/;i<num;i++){
if(num % i == 0){
return false;
} // else // and the final test too
}
if(i == num){
return true;
}
但那效率不高。您只需检查i
不超过sqrt(num)
。另外,如果您检查num%2
,则不再需要检查任何其他偶数,因此您可以使用增量2.或者您甚至可以按 6 计算:
if( num == 2 || num == 3 ) return true;
if( num < 2 || num % 2 == 0 || num % 3 == 0 ) return false;
for( int i=5, j=7, lim=sqrt(num); i<=lim; i+=6, j+=6 ){
if( num % i == 0 || num % j == 0 ){
return false;
}
}
return true;
(注意:这比这里的另一个答案更有效,它说这是对这个答案的初始版本的“优化”)。
答案 5 :(得分:0)
bool isprime(int n)
{
if(n<2) return false;
if(n==2)return true;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return false;
return true;
}