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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM