C++求素数问题

安静_xju 2014-10-17 10:44:46
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long a[78500],i,j,a_size,biaoji;
a[0]=2;
a[1]=3;
a_size=2;
for(i=4;; i++)
{
biaoji=0;
if(a_size>78500)
break;
for(j=0; j<a_size&&a[j]<=sqrt(i); j++)
{
if((i%a[j])==0)
{
biaoji=1;
break;
}
}
if(biaoji==0)
{
a[a_size]=i;
a_size++;
}
}
return 0;
}


这是我的一个求素数的代码,不知道还可不可以进一步优化,求大神指点。
...全文
414 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
安静_xju 2014-10-20
  • 打赏
  • 举报
回复
非常感谢5楼的兄弟的代码,不过看到你isPrime这个函数我就知道不符合我的要求了,不过你的代码还是很好的。
fngt32222 2014-10-18
  • 打赏
  • 举报
回复
#include <iostream> #include <cmath> #include <iomanip> using namespace std; int main() { bool prime(int); int i,n=0; for (i = 11; i < 200; i++)//要选择素数的范围 if (prime(i)) { cout << setw(5) << i; n = n + 1; } return 0; } bool prime(int n) { int i, k = sqrt(n); for (i = 2; i <= k;i++) if (n%i == 0) { return false; } } } bool prime(int n) { int i, k = sqrt(n); for (i = 2; i <= k;i++) if (n%i == 0) { return false; } }
chindax 2014-10-18
  • 打赏
  • 举报
回复
代码重发一下!

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

chindax 2014-10-18
  • 打赏
  • 举报
回复
#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;
}


以上是我的测试代码,然后以下是测试结果:


狼异族 2014-10-17
  • 打赏
  • 举报
回复
/*	去掉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;
			}
		}
	}
}
  • 打赏
  • 举报
回复
引用 楼主 u010207220 的回复:
#include <iostream> #include <cmath> using namespace std; int main() { long long a[78500],i,j,a_size,biaoji; a[0]=2; a[1]=3; a_size=2; for(i=4;; i++) { biaoji=0; if(a_size>78500) break; for(j=0; j<a_size&&a[j]<=sqrt(i); j++) { if((i%a[j])==0) { biaoji=1; break; } } if(biaoji==0) { a[a_size]=i; a_size++; } } return 0; } 这是我的一个求素数的代码,不知道还可不可以进一步优化,求大神指点。
你这个代码写的太乱了, int startn = 2; int endn = 10000 ;//你要查询的范围 bool flg = false; int k = 0; for (int i = startn;i<endn;i++) { flg = false; k = sqrt(i); for (int j = 2;j<= k;j++) { if (i%j == 0) { flg = true; break; } } if (! flg) { printf("%-5d",i); } }
安静_xju 2014-10-17
  • 打赏
  • 举报
回复
2楼的兄弟,你这个是最基础的一个求素数的代码,效率很低的,你这个计算到10000的时间要比我计算到100万的时间都长。建议你上网看一看线性求素数的方法。
赵4老师 2014-10-17
  • 打赏
  • 举报
回复
Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872&

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧