用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++代码
------解决方案--------------------
求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; } }