zoukankan      html  css  js  c++  java
  • 简单数论

    参考:《挑战程序设计竞赛》

    1.辗转相除法 --- gcd和lcm

    代码:

    #include<cstdio>
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    //===================//
    //int 类型函数gcd:
    //计算最大公约数。
    //方法:辗转相除。 
    //===================// 
    int gcd(int a,int b) //gcd复杂度<O(log max(a,b))
    {
    	int t;
    	if(a<b)
    	{
    		t=a;
    		a=b;
    		b=t;
    	}
    	
    	if(b==0)return a;
    	else return gcd(b,a%b);
    }
    //===================//
    //int 类型函数lcm:
    //计算最小公倍数。
    //方法:a*b/gcd(a,b) 
    //===================// 
    int lcm(int a,int b,int gcd)
    {
    	return a*b/gcd;
    }
    
    int main()
    {
    	int a,b;
    	while(scanf("%d%d",&a,&b)!=EOF)
    	{
    		int g=gcd(a,b);
    		int l=lcm(a,b,g);
    		
    		printf("%d
    ",l);
    	}
    	return 0;
    }
    

    实现依据:gcd(a,b)=gcd(b,a%b)

    关于求最小公倍数,更为简单的方法:求n个数的最小公倍数

    2.素性测试

    代码:

    #include<cstdio> 
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    int prime(int a)
    {
    	int i;
    	for(i=2 ; i*i<=a ;i++)//遍历2到根号a
    	{
    		if(a%i==0)return 0;
    	}
    	return 1;
    }
    
    int main()
    {
    	int a;
    	while(scanf("%d",&a)!=EOF)
    	{
    		if(prime(a)==1)printf("%d is a prime
    ",a);
    		else printf("%d is not a prime
    ",a);
    	}
    	return 0;
    }
    

    依据:
    如果d是n的约数,那么n/d也是n的约数。n=d*n/d可得min(d,n/d)<=根号n

    3.埃氏筛法

    代码:

    #include<cstdio>
    #include<iostream>
    #include<stdlib.h>
    #define MAX_N 100000000 
    using namespace std;
    //=================//
    //埃氏筛法:  
    //枚举n以内素数 
    //=================//
    bool is_prime[MAX_N+1];//is_prime[i]==1说明是素数 
    int prime[MAX_N]; 
    int sieve(int n)
    {
    	int p=0;
    	int i,j;
    	
    	for(i=0;i<=n;i++)
    	is_prime[i]=true; //初始化 
    	
    	is_prime[0]=is_prime[1]=false; //0 1不是素数 
    	
    	for(i=2;i<=n;i++)
    	{
    		if(is_prime[i])
    		{
    			prime[p]=i; //存储素数 
    			p++;
    			
    			for(j=2*i ; j<=n ; j+=i) //j从2i开始 如果是i的倍数 置false 
    			{
    				is_prime[j]=false; //非素数 
    		    }
    		}
    	}
    	return p;
    }
    
    int main()
    {
    	int n;
    	while(scanf("%d",&n)!=EOF)
    	{
    		printf("total:%d
    ",sieve(n));
    	}
    	return 0;
    }
    

    原理:保留0到n内所有质数,同时除去所以合数。

  • 相关阅读:
    python的生成Jwt
    qq邮箱验证
    DJango反序列化器的参数效验
    python三元运算,继承,help函数 args
    python时间板块,计算取值,math函数
    No migrations to apply. django同步数据库失败
    redis理论部分
    Java入门——day1
    HBO《硅谷》中的二进制码
    复习总表现(每天记录一下)
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5311916.html
Copyright © 2011-2022 走看看