算法中数学问题

数学问题

1.欧几里得及其扩展

线段上格点的个数:

int gcd(int a, int b)  //欧几里得辗转相除递归程序,时间O(logmax(a,b))
{
    if(b==0) return a;    //a,b再一次赋值后,当除数为0返回a,结束
    else gcd(b,a%b);	//否则a,b,a%b左移,a=b,b=a%b,再一次辗转
}

扩展欧几里得(青蛙的约会)

2.有关素数的算法

判断一个数是否是素数

素数是大于1的数,素数只有1和其本身两个因数

int is_prime(int n)     //O(sqrt(n))
{
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0) return false;
   	return n!=1;  //1不是素数
}

判断<=n的素数个数

最快的方法是埃式筛法时间复杂度O(nloglogn)近似线性


判断[a,b)区间内的素数

类似埃式筛法,这里使用线性筛法。

找规律(对于极大的数据,找周期):1021 (Fibonacci Again)

0和任意非零自然数n的最大公因数都等于n!!!

0和0没有最大公因数

求最大公因数:欧几里得算法(辗转相除法)

求最小公倍数:两数的乘积/最大公因数(因为两数除最大公因数外的部分互质

  • 快速幂取模(积的模等于模的积(或者模的积再取模-------可使用二分加速
  • 再fibonacci

你可能感兴趣的:(算法)