用于检查素数不起作用的C ++代码

时间:2012-08-01 06:41:01

标签: c++ primes

我遇到了这个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;
        }
}

6 个答案:

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