怎样用C语言解决这个问题:输出1到1000000000的所有素数,并且对称,,运行时间不超过30秒,非常感谢!

2025-03-12 09:27:18
推荐回答(2个)
回答1:

for (int i=1 ;i<=1000000000;i++)
{
if (sushu(i))
{
printf("%d",i);
}
}

bool sushu(int k)
{
return false;
是素数
则 return true;
}

回答2:

#include
#include//两个必须的文件
#include//两个必须的文件
#include
using namespace std;
const __int64 MAX=1000000000;
const int MAXP=600000000;
int sto[1000000],c=0;
__int64 pa(__int64 n)
{
int bit[100],i=0,j,len;
while(n)
{
bit[i++]=n%10;
n/=10;
}
len=2*(i-1)+1;
i=0;
for(j=len-1;j>=i;j--,i++)
bit[j]=bit[i];

j=len;
n=0;
for(i=j-1;i>=0;i--)
n=n*10+bit[i];
return n;
}
__int64 pb(__int64 n)
{
int bit[100],i=0,j,len;
while(n)
{
bit[i++]=n%10;
n/=10;
}
len=2*(i);
i=0;
for(j=len-1;j>=i;j--,i++)
bit[j]=bit[i];

j=len;
n=0;
for(i=j-1;i>=0;i--)
n=n*10+bit[i];
return n;
}
bool prime(int n)
{
int i;
if(n<2)return false;
for(i=2;i*i<=n;i++)
{
if(n%i==0)return false;
}
return true;
}
int main()
{
__int64 i,a,b;
int s=time(0),e;
for(i=1;i {
a=pa(i);
b=pb(i);
//printf("%I64d %I64d\n",a,b);
if(a>MAX&&b>MAX)break;
if(a>2&&a sto[c++]=a;
if(b>2&&b sto[c++]=b;
//printf("%d\n",i);
}
//printf("c=%d\n",c);
getchar();
sort(sto,sto+c);
for(i=0;i e=time(0);
printf("耗时%d秒\n",e-s);
return 0;
}

/*
解决思路是把2和3的倍数先去掉,这样的话个数就减少到了6亿多了.
除了2,3的倍数以外,每个数字对应到数组,用这个数字前面有多少和2,3互质的个数来对应
44623
此次运行耗时42秒
44633
此次运行耗时42秒
44641
此次运行耗时42秒
44647
此次运行耗时42秒
44651
此次运行耗时42秒
44657
此次运行耗时42秒
44683
此次运行耗时42秒
44687
此次运行耗时42秒
44699
此次运行耗时42秒
44701
此次运行耗时42秒
44711
此次运行耗时42秒
共发现98222287个素数
此次运行耗时45秒
请按任意键继续. . .
*/
#include
#include//两个必须的文件
#include//两个必须的文件
const __int64 MAX=1000000000;
const int MAXP=700000000;
bool p[MAXP]={false};
__int64 x[2]={2,3};
int c=2;

int cal(int n)//计算n这个数字在数组中的位置,即小于等于n的前面有多少个不能被2和3整除

{
return n-n/2-n/3+n/6;
}
int bin(int x,int low,int high)
{
int mid,ret=0,t;
while(low<=high)
{
mid=(low+high)>>1;
t=mid-mid/2-mid/3+mid/6;
if(t>=x)
{
ret=mid;
high=mid-1;
}
else low=mid+1;
}
return ret;
}
bool param(int n)
{
int i=0,j=0,bit[100];
while(n)
{
bit[i]=n%10;
n/=10;
i++;
}
i--;
while(j<=i&&bit[i]==bit[j])
{
j++;
i--;
}
return j>i;
}
void main()
{

__int64 i,cnt=0;
int j,k;
int s=time(0),e;
p[1]=true;//第一个是1
p[0]=true;//第0个是0,这两个都不是素数
for(i=2;i*i {

if((i&1)&&i%3!=0&&!p[cal(i)])
{

//printf("%I64d\n",i);

k=0;
for(j=i*i;j {
if(0==(j&1)||j%3==0)continue;
//printf("%d\n",j);

k=j-j/2-j/3+j/6;//查找j这个数字在数组是第几位
p[k]=true;
}

//e=time(0);
//printf("此次运行耗时%d秒\n",e-s);
//getchar();
}
}
k=MAX-MAX/2-MAX/3+MAX/6;
j=0;

printf("3\n");

for(i=2;i<=k;i++)
{
if(p[i]==false)
{
j=bin(i,j,MAX);
if(param(j))
{
printf("%d\n",j);
}
}
}
//printf("共发现%d个素数\n",j+2);//再加上2和3两个
e=time(0);
printf("此次运行耗时%d秒\n",e-s);
}
我在写另一个高效的

高效的来了