计算质数  六种境界(含代码实现)

计数质数  六种境界(含代码实现)

以下均基于此思想

//境界一 傻子作法(也就是我)

int countPrimes(int n) {
    int i,j,sushu_flag = 1,sushu_sum = 0;
    for(j=2;j<n;j++)
    {
        for(i=2;i<j;i++)
        {
            if((j%i)==0)
            {   
                sushu_flag=0;
                break;
            }
        }
        if(sushu_flag)
            sushu_sum++;
        sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
    }
    return sushu_sum;
}



//境界2 除二做法(还是不满足题目要求,只减少了境界1的一半时间) 除二是因为 sushu的因子是整数 所以极限是
//          2*(素数/2)所以最小是2,最大是素数除以二。

int countPrimes(int n) {
    int i,j,sushu_flag = 1,sushu_sum = 0;
    for(j=2;j<n;j++)
    {
        for(i=2;i<=j/2;i++)//注意!!!j/2
        {
            if((j%i)==0)
            {   
                sushu_flag=0;
                break;
            }
        }
        if(sushu_flag)
            sushu_sum++;
        sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
    }
    return sushu_sum;
}


//境界3 奇数做法(还是不满足题目要求,只减少了境界1的一半的一半时间)奇数指的是被判断的数字

int countPrimes(int n) {
    int i,j,sushu_flag = 1,sushu_sum = 0;
    for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
    {
        //printf("j = %d",j);
        if(j == 1)sushu_flag=0;//1不是素数
        for(i=2;i<=j/2;i++)
        {
            if((j%i)==0)
            {   
                sushu_flag=0;
                //printf("j = %d",j);
                break;
            }
        }
        if(sushu_flag)
        {
            sushu_sum++;
            //printf("j = %d",j);
        }
        sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
    }
    if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
    return sushu_sum;
}


//境界4 根号做法(满足题目要求,不满足我的好奇心)素数判定是看它的因数里面是否有除了自己和它本身的其他整数,100 的引因数 1 100;2 50;4 25;...;10 10;由此可见,两个因数一个大于等于根号100,另一个小于等于根号100.所以只要找到从2到根号100里面有没有是100的因子即可。

int countPrimes(int n) {
    int i,j,sushu_flag = 1,sushu_sum = 0;
    for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
    {
        //printf("j = %d",j);
        if(j == 1)sushu_flag=0;//1不是素数
        for(i=2;i<=sqrt(j);i++)
        {
            if((j%i)==0)
            {   
                sushu_flag=0;
                //printf("j = %d",j);
                break;
            }
        }
        if(sushu_flag)
        {
            sushu_sum++;
            //printf("j = %d",j);
        }
        sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
    }
    if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
    return sushu_sum;
}


//境界5 查表法(因为判断了3,就不用判断9了,所以直接判断素数是不是他的因子即可)把每次算的素数存到表里即可实现

int countPrimes(int n) {
    int i,j,sushu_flag = 1,sushu_sum = 0;
    int sushu[1000000] = {0};//存放算好的素数 
    sushu[0] = 2;
    for(j=1;j<n;j=j+2)//注意!!!j+=2//奇数
    {
        //printf("j = %d",j);
        if(j == 1)sushu_flag=0;//1不是素数
        for(i=0;sushu[i]!=0&&sushu[i]<=sqrt(j);i++)//每次只要判断小于根号100的素数即可
        {
            if((j%sushu[i])==0)
            {   
                sushu_flag=0;
                //printf("j = %d",j);
                break;
            }
        }
        if(sushu_flag)
        {
            sushu_sum++;
            sushu[sushu_sum] = j;//每次算完把素数存到素数数组中
            //printf("j = %d",j);
        }
        sushu_flag=1;//每次判断完清零 素数标志(类似清除中断标志位)
    }
    if(n>2)sushu_sum++;//因为判断的都是奇数,所以得加上2
    return sushu_sum;
}



//境界6 筛选法 把合数(也就是非素数全部都筛掉即可)
 

int countPrimes(int n) {
    int sushu_sum = 0;
    //char bit_array[] = {0};
    bool Bit_array[10000000];
    long long i,j;
    if(n==0)return 0;
    Bit_array[0] = false;Bit_array[1] = false;//0和1都是合数
    for( i=2; i<=n; ++i)
        Bit_array[i] = true;//初始化数组
    
    for( i=2; i<=n; ++i)//找到合数
    if(Bit_array[i]) // if i is prime number
        for( j=i*i; j<=n; j+=i)
            Bit_array[j] = false;
    
    for( i=2; i<n; ++i){//计数
        if(Bit_array[i])
            sushu_sum++;
    }
    return sushu_sum;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值