判断是否为质数的快速算法
发布网友
发布时间:2022-05-22 10:58
我来回答
共5个回答
热心网友
时间:2024-03-08 04:13
#include<stdio.h>
#include<stdlib.h>
#define SIZE 1000000
char table[SIZE];
int prime[168]=
{
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97,101,103,107,109,113,
127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,
199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,
283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,
383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,
467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,
577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,
661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,
769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,
877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,
983,991,997
};
int init()
{
int i,j;
memset(table,1,SIZE);
table[0]=table[1]=0;
for(i=0;i<168;++i)
{
for(j=prime[i]*2;j<SIZE;j+=prime[i])
{
table[j]=0;
}
}
}
int main()
{
int i;
init();
while(scanf("%d",&i)!=EOF)
{
printf(table[i]?"yes":"no");
}
return 0;
}
热心网友
时间:2024-03-08 04:13
直接定义一个a[1000001],不用二分法,很快的:
#include<stdio.h>
int a[1000001]={0};
int main()
{
int i,j;
i=2;
a[1]=1;
while(i<=500000)
{
for(j=2;i*j<=1000001;j++)
a[i*j]=1;
i++;
while(a[i]==1) i++;
}
scanf("%d",&i);
while(i!=0)
{
if(a[i]==0) printf("素数\n");
else printf("不是素数\n");
scanf("%d",&i);
}
return 0;
}
热心网友
时间:2024-03-08 04:14
// 判断n是否为质数
bool IsPrimeNumber(int n)
{
if (n==2)
{
return true;
}
if (n%2==0)
{
return false;
}
int sqrtn=(int)sqrt((double)n);
bool flag=true;
for (int i=3;i<=sqrtn;i+=2)
{
if (n%i==0)
{
flag=false;
}
}
return flag;
}
热心网友
时间:2024-03-08 04:14
我用筛法 筛选出 10^6以内的素数 大概耗时46ms
那你直接用筛法来判断是不是质数不就OK了
热心网友
时间:2024-03-08 04:15
这个方法是目前最实用的 要突破时间 只能从数学方面入手