zoukankan      html  css  js  c++  java
  • 数论的编程实验

    算法竞赛中围绕数论三个重要问题

    • 素数运算

    • 求解不定方程和同余房程

    • 积性函数的应用

    1.素数运算实验范例

    • 1).计算[2,n]区间中所有素数

    • 2) 大整数素数测试

    1.1 使用筛法生成[2,n]区间中所有素数

    a. 最简单之埃拉托斯特尼筛法
    思想:辅助数组做筛子,递增搜索筛子中最小数,把被搜索数的倍数从筛中去掉,最后留下的数字是素数
    实现代码:
    #include <iostream>
    #define MAXN 50005
    using namespace std;
    
    bool u[MAXN];  //辅助数组做筛子
    int su[MAXN]; //素数集合
    
    void SieveOfEratosthenes(int n)
    {
        int i,j,num=0;
        for(i=2;i<=n;i++)
        {
            u[i]=true;
        }
        for(i=2;i<=n;i++)
        {
            su[i]=true;
        }
        for(i=2;i<=n;i++)
        {
            if(u[i])
            {
                for(j=2;j*i<=n;j++)
                {
                    u[j*i]=false;
                }
            }
        }
        for(i=2;i<=n;i++)
        {
            if(u[i])
            {
                su[num++]=i;
            }
        }
    }
    
    // Test
    int main()
    {
        SieveOfEratosthenes(100);
        for(int i=0;i<=100;i++)
        {
            if(su[i]!=0&&su[i]!=1)
                cout<<su[i]<<endl;
        }
        return 0;
    }
    
    时间复杂度:O(n*long(long n))
    b.加一点优化就是欧拉筛法
    思想:埃氏筛法中,每一个合数重复计算,欧拉筛法就是优化到每一个合数仅算一次筛掉,优化算法
    实现代码:
    #define MAXN 50005
    
    bool u[MAXN];  //辅助数组做筛子
    int su[MAXN]; //素数集合
    
    void SieveofEuler(int n)
    {
        int i,j,num=0;
        memset(u,true,sizeof(u));
        for(i=2;i<=n;i++)
        {
            if(u[i])
            {
                su[num++]=i;
            }
            for(j=0;j<=num;j++)
            {
                if(i*su[j]>n)
                {
                    break;
                }
                u[i*su[j]]=false;
                if(i%su[j]==0)
                {
                    break;
                }
            }
        }
    }
    
    //Test
    int main()
    {
        SieveofEuler(100);
        for(int i=0;i<=100;i++)
        {
            if(su[i]!=0)
                cout<<su[i]<<endl;
        }
        return 0;
    }
    
    时间复杂度:O(n)
  • 相关阅读:
    JavaScript—飞机大战
    JavaScript—瀑布流
    JavaScript—原生轮播和无缝滚动
    JavaScript—封装animte动画函数
    JavaScript—offset、client、scroll
    JavaScript—对象创建方式
    JavaScript—var lef const区别
    P1352 没有上司的舞会 题解
    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题解
    P2522 [HAOI2011]Problem b 题解
  • 原文地址:https://www.cnblogs.com/xzmds/p/5545913.html
Copyright © 2011-2022 走看看