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

用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;
    }
}