c语言求素数以及改进算法

代码需要使用c99编译

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//是否为素数
//从2到x-1测试是否可以整除
//时间复杂度O(n-2),n趋向正无穷
int isPrime(int x)
{
    int ret = 1;
    for(int i = 2; i < x; i++)
    {
        if(x % i == 0)
        {
            ret = 0;
            break;
        }
    }
    return ret;
}

//除了2以外,所有的偶数都不是素数,从3到x-1,每次加2
//x为偶数时间复杂度O((n-3)/2+1)
//x很大时时间复杂度接近于(n/2)
int isPrime2(int x)
{
    int ret = 1;
    if(x == 1 || (x % 2 ==0 && x != 2))
        ret = 0;

    for (int i = 3; i < x; i += 2)
    {
        if( x % i == 0)
        {
            ret = 0;
            break;
        }
    }

    return ret;
}

//无须到x-1,到sqrt(x)
//时间复杂度O(Log2n) 即sqrt(x)
int isPrime3(int x)
{
    int ret = 1;

    if(x == 1 || x % 2 == 0 && x != 2)
        ret = 0;
    for(int i = 3 ; i < sqrt(x); i += 2)
    {
        if( x % i == 0)
        {
            ret = 0;
            break;
        }
    }

    return ret;
}

//判断是否能被已知的且<x的素数整除
int isPrime4(int x, int knownPrimes[], int numberOfKnownPrimes)
{
    int ret = 1;
    int i;

    for( i = 0; i < numberOfKnownPrimes; i++)
    {
        if (x % knownPrimes[i] == 0 )
        {
            ret = 0;
            break;
        }
    }

    return ret;
}

int main()
{
    const int number = 100;
    int prime[number] = {2};
    int count = 1;
    int i = 3;

    while( count < number )
    {
        if(isPrime4(i ,prime, count))
        {
            prime[count++] = i;
        }
        i++;
    }

    for( i = 0; i < number; i++)
    {
        printf("%d",prime[i]);
        if( (i + 1) % 5 ) printf("\t");
        else printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/passedbylove/p/11332794.html

时间: 2024-10-28 19:08:53

c语言求素数以及改进算法的相关文章

c语言求素数

大于1的自然数不是素数就是合数,只要能被素数整除就不是素数,据此逐个打印素数,可不调用库函数sqrt. #include<stdio.h> int main(void) { int i, j; int prime[50] = { 2, 3, 5, 7, 11, 13, 17, 19}; int k = 8; for(i = 20; i < 201; ++i) { for(j = 0; j < k; ++j) { if( i % prime[j] == 0) break; } if(

C语言最优化求素数

初学C语言,看到求素数的代码,不是太满意,自己设计了一个计算流程图.在贴吧里也问了一下,和"埃拉托色尼(Eratosthenes)筛法”有些撞车,当然在下不敢与数学巨匠们争长短,不过还是想自己试一下. 百度了一下有人已经用这类方法做了代码,不过和我的想法有出入. 思路: 1要避免冗余的求余计算的计算次数,这样在数字足够大的时候更能体现更高的计算效率, 1)分母排除偶数,可以减少一半的计算量.具体做法是改+1递增为从第二个素数3开始+2递增; 2)筛选求余计算的分子,而根据素数的定义,只要不被小于

C语言求质数的算法

前言 上次被出了一题质数的C语言求解题目(面试),当时用了最粗暴的算法,回来仔细参考资料,其实答案有很多种: 1,小学生版本: 判断 x 是否为质数,就从 2 一直算到 x-1. static rt_uint32_t array1[ARRAY_LEN]; void func1(void) { for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++) { array1[i - 1] = 0; } rt_uint32_t x, y = 0, z = 0; rt_uin

【算法】普通方法和筛选法求素数

素数指的是因子只有1和本身的数(1不是素数),求解素数在数学上应用非常广泛,而求解n以内的素数也是我们编程时常遇到的问题,在这个问题上,筛选法求解素数运行得非常快.下面首先介绍如何判断一个是不是素数,然后介绍用普通方法求n以内的素数,接着是筛选法求n以内的素数,最后是两种算法的运行时间比较 判断一个数是不是素数 算法思想:判断小于等于一个数的平方的所有大于1的整数是不是能整除这个数,如果能,则表明这个数不是素数:反之,则是素数. //判断一个数是否为素数 bool isPlain(int val

蓝桥杯 算法训练 Torry的困惑(基本型)(水题,筛法求素数)

算法训练 Torry的困惑(基本型) 时间限制:1.0s   内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题告诉老师.老师愣住了,一时回答不出来.于是Torry求助于会编程的你,请你算出前n个质数的乘积.不过,考虑到你才接触编程不久,Torry只要你算出这个数模上50000的值. 输入格式 仅包含一个正整数n,其中n<=100

[转载]基础算法——筛法求素数

以下来自http://blog.csdn.net/stack_queue/article/details/53560887 求素数是程序设计比赛中经常遇到的问题,最基本的方法是通过素数的定义直接判断,只能被1和它本身整除的数就是素数了.这种方法适合判断单个数是否为素数,当要求一个范围内素数而这个范围又比较大时,这种方法就不太使用了,甚至程序要运行几分钟才能算出结果. 筛法的思想是去除要求范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为

【转】C语言快速幂取模算法小结

(转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余).在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快.计算范围更大的算法,产生了快速幂取模算法.我们先从简单的例子入手:求abmodc 算法1.直接设计这个算法: int ans = 1; for(int i =

数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the

筛法求素数的最优算法+解释

筛法求素数: 求n内的素数.先用2去筛,即把2留下,把2的倍数剔除掉:再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉:接下去用下一个质数5筛,把5留下,把5的倍数剔除掉:不断重复下去……. 由此,我们可以写出基础版的筛法求素: const int maxn = 102410240; bool isp[maxn]; void init() { memset(isp, true, sizeof(isp)); isp[0] = isp[1] = false; const int max1 =