大素数高效算法判断


前段日子我也在做素数,下面是我的一个总结,看到那个2秒搞定的,我还真想去看看


当数字小于1000000时,可以用简单的判断
int isprime(int n)  
{ 
    int i; 
    for(i=2;i<=sqrt(n);i++) 
        if (n%i==0) 
          return 0; 
    return 1; 
}   

 
 
 

但当数值在1000000到100000000时 
介绍一种方法 
prime={2,3,5,7,11,13,17,……}为事先做好的素数表 
如果需要判断的数最大为100000000,则prime的最大元素为大于10000的最小素数即可 
 
//素数表生成法:  
int t[10010]={0},prime[3000];//3000可能有点大,具体多少运行了,就知道了  
int len;  
void getprime(void)  
{  
    int i,j;  
    t[0]=t[1]=1;          //t[i]=1,表示该数不是素数,被筛除  
    for(i=2;i <=sqrt(10010);i++)  
    {  
       if(!t[i])  
       {  
           for(j=i+i;j<10010;j+=i)  
               t[j]=1;  
        }  
     }  
    len=0;  
    for(i=2;i <10010;i++)  
    {  
        if(!t[i])  
            prime[len++]=i;  
    }  
}  
 
int isprime(long n)  
{  
    int i;  
    while(prime[i]*prime[i] <=n)  
    {  
        if(n%prime[i]==0)  
            return 0;  
        i++;  
    }  
    return 1;  
}  



 

如果数值大于100000000时 
可以用Miller-Rabbin素数测试法,判断是否为素数 

int Miller_Rabbin(long long n)  
{  
    long long i,s,a;  
    s=10;    //s的值可以根据需要变大  
 // randomize();  
    for(i=0;i <s;i++)  
    {  
        a=long long(rand()%(n-1)+2); //自动生成受限  
        if(modular_exp(a,n-1,n)>1)  
            return 0;  
    }  
    return 1;  
}  
long long modular_exp(long long a,long long b,long long c)//求a^b%c该函数受限  
{  
    if(a==0)  
        return 0;  
    if(b==0)  
        return 1;  
    if(b==1)  
        return a%c;  
    return (a*modular_exp(a,b-1,c))%c;  
}   


最普通的筛法:(算法竞赛必会)

 
 
#include<stdio.h>
#include<stdbool.h>
int main (void)
{
    int n=100,i,j;
    bool prime[101];              //C99 bool在#include<stdbool.h>中
    memset(prime,1,sizeof(prime));//全定义为素数
    prime[0]=prime[1]=0;          //0和1不是素数
    for (i=2; i<=sqrt(n); i++)
    {
        if(prime[i])
        {
            for(j=i*i; j<=n; j+=i)//j=i*i是j=i+i的优化
            {
                prime[j]=0;
            }
        }
    }
    int k=0;
    for(i=0; i<=n; i++)
    {
        if(prime[i])
        {
            k++;
            printf("%d ",i);
        }
    }
    printf("\n~~~%d ",k);
    return 0;
}


 
 
  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值