读书人

纯素数有关问题小弟我要吐血了

发布时间: 2013-07-01 12:33:04 作者: rapoo

纯素数问题,我要吐血了-


#include<iostream>
#include<string>
#include<cmath>
#include<cstdio>
#define N 10000001
__int64 n ;
void power(__int64 a, __int64 p, __int64 n,__int64& result,bool& composite)
{
__int64 x;
if(p==0)result=1;
else
{
power(a,p/2,n,x,composite);
result=(x*x)%n;
if(result==1&&(x!=1)&&x!=(n-1)) composite=true;
if((p%2)==1)result=(result*a)%n;
}
}
bool prime(__int64)
{
__int64 i, a,result ;
for (i=1; i<=5; i++)
{
bool composite=false;
a = 2 + rand()%(n-2) ;
power(a, n-1, n,result,composite);
if(composite||(result!=1))return false;
}
return true;
}
int main()
{
using namespace std;
char *x=new char[N];
memset(x,1,sizeof(x));
x[0]=x[1]=false;
int i,j;
for (i=2;i<=10000;i++)
{
if (x[i])
{
for (j=2*i;j<N;j+=i)
x[j]=0;
}
}
//
int t,m,tmp,r=1;
while(cin>>t)
{
if (t==1) printf("2\n3\n5\n7\n");
else
{
for (m=(int)pow(10.0,t-1);m<(int)pow(10.0,t);m++)
{
if (m%10==3||m%10==7)
{
int M=m;tmp=10;
if (t==8)//转换为7位处理
{
n=m;
if (!prime(n)) continue;
else
{
M=m%10000000;
if (x[M]==2) {printf("%d\n",m);continue;}
}
}
if (x[M]==0) continue;
else
{
while(M%tmp!=M)
{
if (x[M%tmp]==0) {r=0;break;}
tmp*=10;
}
if (r) printf("%d\n",m),x[M]=2;//标记为纯素数
r=1;
}
}
}
}
}
delete [] x;
return 0;
}

[解决办法]
8位就超内存?是8个十进制位吗?
8位数才100M,就算一个字节存一个标志也不会超啊,如果一个字节存8个标志那就只要12.5M。楼主不是在用Dos吧?
[解决办法]
8位数怎么可能超内存啊?
[解决办法]
先用筛法求质数,做个表
然后进行N轮
第1轮 求1位数的质数,进队列
第2轮 取队列中1个质数,数字前加1位(0--9),查表,是素数的话进新的队列,直到原队列空.
...

这样每次都是在上一轮的基础上进行筛选,不用从1到某个数连续进行判断。

读书人网 >C++

热点推荐