64,637
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<vector>
#include<cmath>
#include<iomanip>
#include<stdlib.h>
#include <sys/time.h>
using namespace std;
const int max_int = ( 1 << 24 ) - 1; //此处可以修改需要测试的数据量大小,现在是16 777 215
bool isPrime( int source ) { //判断参数是否为素数
int source_sqrt = sqrt( source );
for(int i = 2; i <= source_sqrt; ++i)
if( source % i == 0 )
return false;
return true;
}
void Prime_field_low( int limited, vector<int>& out ) { //对(0, limited]这个区间确定有多少素数,完全是平方阶,而且没有优化
for( ; limited > 0; --limited )
if( limited & 1 == 0 )
continue;
else if( isPrime( limited ) )
out.push_back( limited );
}
void Prime_field_high( int limited, vector<int>& out ) { //任何数都是素数的乘积,对奇数开平方根的结果至3这个范围内的每个素数进行遍历判断
if( limited > 3 ) { //虽是平方阶,但是经过了优化
out.push_back( 1 );
out.push_back( 2 );
out.push_back( 3 );
}
else {
Prime_field_low( limited, out );
return;
}
for( int i = 5; i <= limited; i += 2 ) {
int index = out.size(), i_sqrt = sqrt( i );
for( int j = 2; j < index; ++j )
if( out[j] <= i_sqrt )
if( i % out[j] == 0 )
break;
else
continue;
else {
out.push_back( i );
break;
}
}
}
int main() {
timeval tv;
vector<int> vl;
int i = 0;
srand( time( NULL ) );
gettimeofday( &tv, NULL );
double cl = tv.tv_sec * 1000 + (double)tv.tv_usec / 1000, dl;
Prime_field_low( max_int, vl );
gettimeofday(&tv, NULL);
dl = ( tv.tv_sec * 1000 + (double)tv.tv_usec / 1000 );
cout << dl << "-" << cl << " = " << dl - cl << "ms" << endl;
//如果所要测试的数据不多,可以将容器中最后得到的数据打印出来
/*for( ; i < vl.size(); ++i )
cout << setw(10) << vl[i];*/
cout << endl;
vl.clear();
gettimeofday( &tv, NULL );
cl = tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
Prime_field_high( max_int, vl );
gettimeofday( &tv, NULL );
dl = ( tv.tv_sec * 1000 + (double)tv.tv_usec / 1000 );
cout << dl << "-" << cl << " = " << dl - cl << "ms" << endl;
/*for( i = 0; i < vl.size(); ++i )
cout << setw(10) << vl[i];*/
return 0;
}
/* 去掉2的倍数、去掉3的倍数、去掉5的倍数。。。*/
#define MAX_NUM 78500
int Prime[MAX_NUM] = {0}; // 素数集
int nPriCnt = 0; // 素数数量
void GetPrime()
{
int arrNum[MAX_NUM] = {0};
int i = 0;
nPriCnt = 0;
for (i = 2; i < MAX_NUM; ++i)
{
if (arrNum[i] == 0)
{
Prime[nPriCnt] = i;
nPriCnt++;
for (int j = (i << 1); j < MAX_NUM; j+=i)
{
arrNum[j] = 1;
}
}
}
}