zoukankan      html  css  js  c++  java
  • 素数

    比赛中常用的素数,这里总结一下各方面 ,先贴一个搞笑的打印素数

    貌似是线性级别的高效。。

    /*
    遇到素数需要打表时,先估算素数的个数:
    num = n / lnx;
    num为大概数字,越大误差越小(只是估计,用于估算素数表数组大小)
    这个打表法效率貌似很高,网上说几乎达到了线性时间(不知道是真是假=。=)
    */
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<ctime>
    #include<algorithm>
    using namespace std;
    int n;
    bool visit[10100000];
    int prime[10000000];
    
    
    void init_prim()
    {
    	memset(visit, true, sizeof(visit));
    	int num = 0;
    	for (int i = 2; i <= n; ++i)
    	{
    		if (visit[i] == true)
    		{
    			num++;
    			prime[num] = i;
    		}
    		for (int j = 1; ((j <= num) && (i * prime[j] <= n));  ++j)
    		{
    			visit[i * prime[j]] = false;
    			if (i % prime[j] == 0) break; //点睛之笔
    		}
    	}
    }
    
    int main()
    {
    	memset(prime, 0, sizeof(prime));
    	int count = 0;
    	cin>>n;
    	init_prim();
    	for(int i = 0; i <= n; ++i)
    		if(prime[i])
    		{
    			cout<<prime[i]<<" ";
    			count++;
    		}
    		cout<<endl;
    		cout<<"素数个数为:"<<count<<endl;
    }        

    判断素数

    bool isPrime(int num)
    {
        if (num == 2 || num == 3)
        {
            return true;
        }
        if (num % 6 != 1 && num % 6 != 5)
        {
            return false;
        }
        for (int i = 5; i*i <= num; i += 6)
        {
            if (num % i == 0 || num % (i+2) == 0)
            {
                return false;
            }
        }
        return true;
    }


     

    最大公约数

    int kgcd(int a, int b)
    {
        if (a == 0) return b;
        if (b == 0) return a;
        if (!(a & 1) && !(b & 1)) return kgcd(a>>1, b>>1) << 1;
        else if (!(b & 1)) return kgcd(a, b>>1);
        else if (!(a & 1)) return kgcd(a>>1, b);
        else return kgcd(abs(a - b), min(a, b));
    


     

  • 相关阅读:
    能量项链
    开学前最后一天信奥赛一本通重刷日记
    重刷信奥赛一本通日记-3
    重刷信奥赛一本通日记-2
    重刷信奥赛一本通日记-1
    第二次考试题解way
    第一次考试题解
    第一次考试感言
    「HNOI2012」矿场搭建
    「HAOI2006」受欢迎的牛
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134157.html
Copyright © 2011-2022 走看看