还是关于求素数的问题。。。

bing_huo 2003-11-20 11:35:08
求10的10次方以下素数 需要速度优化,查了一堆关于筛法的资料,发现还是很难解,谁有好的思路和方法,,,如果正确马上给分结帐
...全文
55 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgaosslotus 2003-11-25
  • 打赏
  • 举报
回复
电脑硬件配置和我的一模一样,够辈分!
bing_huo 2003-11-24
  • 打赏
  • 举报
回复
自己再up一下,还有没有别的思路???
liangbch 2003-11-24
  • 打赏
  • 举报
回复
NowCan 给出的代码来自这个贴子http://search.csdn.net/expert/topic/6/603/2003/4/3/1614558.htm,我曾在这个贴子中贴了多个程序,下面列出我最后的回复。

程序终于调通。程序运行速度如下:

计算 1千万以内的质数: 0.107s

计算 1亿以内的质数: 1.053s

计算 10亿以内的质数: 11.54s

计算 100亿以内的质数: 142.18s


我的电脑硬件配置为:奔III-550,RAM 128MB

NowCan 2003-11-20
  • 打赏
  • 举报
回复
其基本思想是分段筛。
NowCan 2003-11-20
  • 打赏
  • 举报
回复
/*
这是别人的筛素数的程序,算到200亿。
*/

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <memory.h>

#define bool char
#define true 1
#define false 0

#define FLAG_UNKNOW 0
#define FLAG_PRIME 1
#define FLAG_NOPRIME 2

void Send2Log(__int64 nMax, __int64 nPrimeCnt);

//#define OUTPUT
clock_t start, finish;
double duration;

//clock_t duration;
int main(void)
{
bool BaseArray[100000];
int Prime[200000];
int i, j, k;
__int64 PrimeCnt;
int QRT, Start, kpoint, RetNo;
__int64 Kpoint;

start=clock();

memset(BaseArray, 1, 100000);

BaseArray[0]=false;
BaseArray[1]=false;
BaseArray[2]=true;
BaseArray[3]=true;

RetNo=11;

for(i=2; i <= sqrt(100000); i++)
{
if(BaseArray[i] == true)
for(j=i + i; j < 100000; j+=i)
{
BaseArray[j]=false;
}
}

PrimeCnt=0;
for(i=2; i < 100000; i++)
{
if(BaseArray[i] == true)
{
Prime[PrimeCnt]=i;
PrimeCnt++;

#ifdef OUTPUT
printf("%d ", i);
if(PrimeCnt % RetNo == 0)
{
if(PrimeCnt % (RetNo * 100) == 0)
printf("\n\t\t\t -- %d --\n", PrimeCnt);
else
printf("\n");
}
#endif
}
}

if(1)
{
// < 10000
RetNo=11;
for(k=1; k < 10000; k++)
{
if(k == 10)
{
RetNo=9;
Send2Log(1000000, PrimeCnt);
}

if(k == 100)
{
RetNo=8;
Send2Log(10000000, PrimeCnt);
}

if(k == 1000)
{
RetNo=8;
Send2Log(100000000, PrimeCnt);
}

kpoint=k * 100000;

memset(BaseArray, 1, 100000);

QRT= (int)sqrt(kpoint + 100000);
i=0;
while(Prime[i] <= QRT)
{
//Start = (Prime[i]-kpoint%Prime[i])%Prime[i] ;
Start=(Prime[i] - (kpoint - 1) % Prime[i]) - 1;
for(j=Start; j < 100000; j+=Prime[i])
{
BaseArray[j]=false;
}

i++;
}

for(i=0; i < 100000; i++)
{
if(BaseArray[i])
{
if(PrimeCnt < 200000) Prime[PrimeCnt]=kpoint + i;
PrimeCnt++;

#ifdef OUTPUT
printf("%d ", kpoint + i);
if(PrimeCnt % RetNo == 0)
{
if(PrimeCnt % (RetNo * 100) == 0)
printf("\n\t\t\t -- %d --\n", PrimeCnt);
else
printf("\n");
}
#endif
}
}
}
}

if(1)
{
// 10000~100000
RetNo=7;
for(k=10000; k < 200000; k++)
{
Kpoint=(__int64) k * 100000;
if(k % 10000 == 0)
{
Send2Log(Kpoint, PrimeCnt);
}

memset(BaseArray, 1, 100000);

QRT= (int)sqrt(Kpoint + 100000);
i=0;
while(Prime[i] <= QRT)
{
Start= (int)((Kpoint - 1) / Prime[i]) * Prime[i] - Kpoint;

//Start = (Prime[i]-Kpoint%Prime[i])%Prime[i] ;

//Start = (int)(Kpoint-((int)(Kpoint/Prime[i]))*Prime[i]) ;
for(j=Start; j < 100000; j+=Prime[i])
{
BaseArray[j]=false;
}

i++;
}

for(i=0; i < 100000; i++)
{
if(BaseArray[i])
{
// if(PrimeCnt<200000)

// Prime[PrimeCnt] = Kpoint+i ;
PrimeCnt++;
#ifdef OUTPUT
printf("%d ", Kpoint + i);
if(PrimeCnt % RetNo == 0)
{
if(PrimeCnt % (RetNo * 100) == 0)
printf("\n\t\t\t -- %d --\n", PrimeCnt);
else
printf("\n");
}
#endif
}
}
}

#ifdef OUTPUT
for(i=0; i < 100000; i++)
{
if(BaseArray[i] == true)
{
if(PrimeCnt < 200000) Prime[PrimeCnt]=99999 + i;

printf("%5d%05d ", 99999, i);

PrimeCnt++;
if(PrimeCnt % RetNo == 0)
{
if(PrimeCnt % (RetNo * 100) == 0)
printf("\n\t\t\t -- %d --\n", PrimeCnt);
else
printf("\n");
}
}
}
#endif
}

Send2Log(20000000000, PrimeCnt);

getch();
return 0;
}

/* */
void Send2Log(__int64 nMax, __int64 nPrimeCnt)
{
finish=clock();
duration= (double)(finish - start) / CLOCKS_PER_SEC;

//duration = (__int64)(finish - start);
printf(">%7.3f秒\t计算到%11I64u\t查出素数:%10I64u个\n", duration, nMax, nPrimeCnt);

//printf(">%13u时钟周期\t计算到%11I64u\t查出素数:%10I64u个\n",duration,nMax,nPrimeCnt) ;
return;
}

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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