查找素数会得到所有奇数

时间:2011-12-05 19:24:04

标签: c++

我编写了一个程序,它从用户那里获取10个整数,然后计算其中的素数并显示总和。问题是它将所有奇数作为素数。我已经尝试了很长时间,但无法弄明白。这是程序。

#include<iostream>
#include<conio>
#include<math>

int isPrime(int);

int main()
{
    int sum_of_prime;
    int count=0;
    int a[10];
    for(int i=1; i<=10; i++){
        cout<<"Enter a number: ";
        cin>>a[i];
        if( isPrime(a[i]) ){
            sum_of_prime+=a[i];
            countp++;
        }
    }
    cout<<"Total Prime Numbers in given Numbers: "<<count<<endl;
    cout<<"Sum of All the prime numbers in given numbers"<<sum_of_prime<<endl;
    getch();
}

int isPrime(int n){
    for(int i=2; i<=sqrt(n); i++){
        if(n%i==0)
            return 0;
        else
            return 1;
    }
}

3 个答案:

答案 0 :(得分:6)

您的isPrime方法会在第一次循环中返回,而 NEVER 会在后续循环中返回。
它检查2,但从不检查3,4,5,6等

在完成整个循环后,您需要return 1;

int isPrime(int n)
{
    for(int i=2; i<=sqrt(n); i++)
    {
        if(n%i==0)
            return 0;  // n has a factor, therefore is not prime, ==> False
    }

    return 1;  // All possible factors were checked, none are factors, therefore prime ==> True
}

P.S。为了提高速度,只需检查2,然后检查3,5,7,9,11等。 检查所有其他偶数(4,6,8等)是没有意义的 如果你只检查奇数,你的运行速度可以快两倍。

您还可以通过循环每次传递sqrt(n)来提高速度。

此功能如下:

int isPrime(int n)
{
    if (n%2 == 0) return 0;  // Check 2 separately.

    int Root = (int)sqrt(n); // Pre-calculate SQRT once!

    for(int i=3; i<=Root; i+=2)  // Increment by TWO at a time, getting 3,5,7,9
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}

答案 1 :(得分:1)

如果isPrime为假,您的1函数将返回(i%2==0)

请改为尝试:

for(int i=2; i<=sqrt(n); i++)
    if(n%i==0)
        return 0;
return 1;

答案 2 :(得分:0)

您的isPrime()函数错误。试试这个:

    bool IsPrime(int num)
{
if(num == 0)
return true;

num = abs(num);

if(num % 2 == 0) return true;

for(int i = 3; i <= sqrt(num); i+=2)
if(num % i == 0)
return false;

return true;
}