33,311
社区成员
发帖
与我相关
我的任务
分享
unsigned short sqrt(unsigned long a){
unsigned long rem = 0;
unsigned long root = 0;
unsigned long divisor = 0;
for(int i=0; i<16; i++){
root <<= 1;
rem = ((rem << 2) + (a >> 30));
a <<= 2;
divisor = (root<<1) + 1;
if(divisor <= rem){
rem -= divisor;
root++;
}
}
return (unsigned short)(root);
}
bool TestPrime(unsigned int n)
{
unsigned int i = 0, sq = 0;
if(n == 1)
return false;
else if(n == 2)
return true;
else if(!(n % 2))
return false;
sq = (unsigned int)sqrt((double)n);
for(i=3; i<=sq; i+=2)
{
if(n % i == 0)
return false;
}
return true;
}
unsigned int *PrimeTable;
unsigned int TableIndex;
void InitTable()
{
TableIndex = 0;
PrimeTable = (unsigned int*)malloc(6543*sizeof(unsigned int));
PrimeTable[0] = 3;
}
void FreeTable()
{
free(PrimeTable);
}
bool TestPrime(unsigned int n)
{
unsigned int i = 0;
if(n == 1)
return false;
else if(n == 2)
return true;
else if(!(n % 2))
return false;
for(i=0; PrimeTable[i] * PrimeTable[i]<=n; i++)
{
if(n % PrimeTable[i] == 0)
return false;
}
if(n<=65521)
PrimeTable[TableIndex++] = n;
return true;
}
int main()
{
LARGE_INTEGER begintime,endtime,freqtime;
__int64 resulttime = 0;
unsigned int num = 2, top = 0, n = 1;
char filename[MAX_PATH],tmpbuf[MAX_PATH];
FILE *outfile = NULL;
do
{
fprintf(stdout,"请输入上限: ");
if(scanf("%u",&top) <= 0)
{
fprintf(stdout,"请输入数字!\n");
fgets(tmpbuf,MAX_PATH,stdin);
continue;
}
else if(top < 2)
fprintf(stdout,"请输入>=2的值!\n");
}while(top < 2);
fprintf(stdout,"请输入保存位置:");
fgets(tmpbuf,MAX_PATH,stdin);
filename[0] = '\0';
fgets(filename,MAX_PATH,stdin);
filename[strlen(filename)-1] = '\0';
outfile = fopen(filename,"w");
QueryPerformanceCounter(&begintime);
InitTable();
if(outfile)
fprintf(outfile,"%u,",num);
for(num=3; num<=top; num+=2)
{
if(TestPrime(num))
{
if(outfile)
fprintf(outfile,"%u,",num);
n++;
}
}
FreeTable();
QueryPerformanceCounter(&endtime);
QueryPerformanceFrequency(&freqtime);
fprintf(stdout,"在<=%u时共有%u个素数\n",top,n);
if(outfile)
{
fprintf(outfile,"\n");
fprintf(outfile,"在<=%u时共有%u个素数\n",top,n);
fclose(outfile);
fprintf(stdout,"结果已保存在: %s\n",filename);
}
resulttime = (endtime.QuadPart - begintime.QuadPart) * 1000 / freqtime.QuadPart;
fprintf(stdout,"处理时间: %I64d小时%I64d分%I64d.%03I64d秒\n",resulttime / 3600000,(resulttime / 60000) % 60,(resulttime /1000) % 60,resulttime % 1000);
return 0;
}
void InitTable(unsigned int n)
{
Table = (unsigned char*)malloc( n+14 );
if(Table == NULL)
{
fprintf(stdout,"内存不足!\n");
exit(-1);
}
}
void FreeTable()
{
free(Table);
}
void TestPrime(unsigned int n)
{
unsigned int i = 0, j = 0;
unsigned char *p = Table+1;
unsigned int mpLen = 2*3*5*7*11*13;
unsigned char *magicPattern = (unsigned char*)malloc(mpLen);
unsigned int remainder = n%mpLen;
unsigned char *pstop = p+n-remainder;
unsigned int step = 0, stop = n/13;
for (i=0; i<mpLen; i++)
{
magicPattern[i++] = 1;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 0;
magicPattern[i++] = 1;
magicPattern[i] = 0;
}
for (i=4; i<=mpLen; i+=5)
magicPattern[i] = 0;
for (i=6; i<=mpLen; i+=7)
magicPattern[i] = 0;
for (i=10; i<=mpLen; i+=11)
magicPattern[i] = 0;
for (i=12; i<=mpLen; i+=13)
magicPattern[i] = 0;
while (p < pstop)
{
memcpy(p, magicPattern, mpLen);
p += mpLen;
}
if (remainder > 0)
memcpy(p, magicPattern, remainder);
Table[2] = 1;
Table[3] = 1;
Table[5] = 1;
Table[7] = 1;
Table[11] = 1;
Table[13] = 1;
for (i=17; i <= stop; i++)
{
if (0 == Table[i])
continue;
step = i*2;
for (j=i*17; j <= n; j+=step)
Table[j] = 0;
}
free(magicPattern);
}
int main()
{
LARGE_INTEGER begintime,endtime,freqtime;
__int64 resulttime = 0;
unsigned int top = 0, n = 0, i = 0;
char filename[MAX_PATH],tmpbuf[MAX_PATH];
FILE *outfile = NULL;
do
{
fprintf(stdout,"请输入上限: ");
if(scanf("%u",&top) <= 0)
{
fprintf(stdout,"请输入数字!\n");
fgets(tmpbuf,MAX_PATH,stdin);
continue;
}
else if(top < 2)
fprintf(stdout,"请输入>=2的值!\n");
}while(top < 2);
fprintf(stdout,"请输入保存位置:");
fgets(tmpbuf,MAX_PATH,stdin);
filename[0] = '\0';
fgets(filename,MAX_PATH,stdin);
filename[strlen(filename)-1] = '\0';
outfile = fopen(filename,"w");
QueryPerformanceCounter(&begintime);
InitTable(top);
TestPrime(top);
for (i=2; i<=top; i++)
{
if(Table[i])
{
n++;
if(outfile)
fprintf(outfile,"%u,",i);
}
}
FreeTable();
QueryPerformanceCounter(&endtime);
QueryPerformanceFrequency(&freqtime);
fprintf(stdout,"在<=%u时共有%u个素数\n",top,n);
if(outfile)
{
fprintf(outfile,"\n");
fprintf(outfile,"在<=%u时共有%u个素数\n",top,n);
fclose(outfile);
fprintf(stdout,"结果已保存在: %s\n",filename);
}
resulttime = (endtime.QuadPart - begintime.QuadPart) * 1000 / freqtime.QuadPart;
fprintf(stdout,"处理时间: %I64d小时%I64d分%I64d.%03I64d秒\n",resulttime / 3600000,(resulttime / 60000) % 60,(resulttime /1000) % 60,resulttime % 1000);
return 0;
}