首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用c语言如何求素数个数?

2012-09-21 
用c语言怎么求素数个数???求a,b之间的素数个数每行输入a和b(0a,b500000)每行输出包括a和b在内的素数个

用c语言怎么求素数个数???
求a,b之间的素数个数  

每行输入a和b(0<=a,b<=500000)  

每行输出包括a和b在内的素数个数  

Sample Input
0 3
5 296
9 9

Sample Output
2
60
0

求c++代码

[解决办法]

C/C++ code
#include <iostream>#include <cmath>using namespace std;int primeNum(int a, int b){    bool isPrime;    int priNum = 0;    if(a < 2)    {        a = 2;    //0和1不是素数    }    for(int i = a; i <= b; ++i)    {        isPrime = true;        int target = static_cast<int> (sqrt(static_cast<double> (i)));        for(int j = 2; j <= target; ++j)        {            if(i % j == 0)            {                isPrime = false;                break;            }        }        if(isPrime)        {            ++priNum;        }    }    return priNum;}int main(){    int a, b;        while(cin>>a>>b)    {        if(a < 0 || b < 0) return -1;        cout<<primeNum(a, b)<<endl;    }    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>int isprime(unsigned long n){    unsigned long i;    if(n == 1 || n == 2 || n == 3 || n == 5)    {        return 0;    }    else if(n % 2)    {        for(i = 3; i <= n / 2 + 1; i += 2)        {            if(n % i == 0)            {                return -1;            }        }        return 0;    }    else    {        return -1;    }}unsigned long count_prime(unsigned long m, unsigned long n){    unsigned count = 0;    unsigned long i;    for(i = m; i <= n; i++)    {        if(isprime(i) == 0)                {            count++;        }    }    return count;}int main(int argc, char* argv[]){    unsigned long m;    unsigned long n;    do{        scanf("%lu %lu", &m, &n);        printf("%lu\n", count_prime(m, n));    }while(m != 0 || n != 0);    return 0;}
[解决办法]
http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

C/C++ code
#include <bitset>#include <cmath>#include <iostream>void test_sieve_of_eratosthenes(){    size_t const SIZE = 1024;    std::bitset<SIZE> sieve;    sieve.flip();    sieve.reset(0);    sieve.reset(1);    size_t const finalBit = sqrt(static_cast<double>(SIZE) ) + 1;    for(size_t i = 2; i != finalBit; ++i)    {        if(sieve[i])        {            for(size_t j = i * 2; j < SIZE; j += i)                sieve.reset(j);        }    }    for(size_t k = 2; k != SIZE; ++k)    {        if(sieve[k]) std::cout<<k<<std::endl;    }} 

热点排行