机试基本算法笔记--数学问题

1.%运算符

a%b:若a为正数,则该结果必为非负数;若a为负数,则表达式必为非正数。表达式结果与b的符号没有直接关系,及a%b==a%-b。

(a*b)%c=(a%c+b%c)%c

(a+b)%c=(a%c+b%c)%c

2.最大公约数

int gcd(int a,int b)//递归
{
     return b==0?a:gcd(b,a%b);  
}

int gcd(int a,int b)
{
    while(!b)
    {
        int t=a%b;
        a=b;
        b=t;
    }
    return a;
}

3.最小公倍数

int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}

4.素数筛选

若一个数不是素数,则必存在一个小于它的素数为其因数。那么假如已经获得了小于一个数的所有素数,只需确定该数不能被这些素数整除,这个数即为素数。换一个角度来讲,在获得一个素数时,即将它的所有倍数均标记成非素数,这样当我们遍历到一个数时,它没有被任何小于它的素数标记为非素数,那么就确定其为素数。

int prime[10000];//保存筛选的素数
int primeSize;//保存素数的个数
bool mark[10001];//若mark[i]为true,则表示该数x已被标记成非素数
void init()
{
    for(int i=1;i<=10000;i++)
    {mark[i]=false;}
    primeSize=0;
    for(int i=2;i<=10000;i++)
    {
        if(mark[i]==true) continue;
        prime[primeSize++]=i;
        for(int j=i*i;j<=10000;j+=i)
        {mark[j]=true;}
    }  
}

5.分解素因数

对于一个数x

p1,p2,...,pn为素数。

那么对于一个数n,求其素因数:

首先筛选出小于n的所有素数,然后依次遍历小于n的素数,判断其是否为n的因数。确定某素数为n的因数,则通过试除确定其对应的幂指数。

int ansPrime[30];//按顺序保存分解出的素因数
int ansSize=0;//分解出素因数的个数;
int ansNum[30];//保存分解出的素因数对应的幂指数
for(int i=0;i<primeSize;i++)
{
    if(n%prime[i]==0)
    {
        ansPrime[ansSize]=prime[i];
        ansNum[ansSize]=0;
        while(n%prime[i]==0)
        {
            ansNum[ansSIze]++;
            n/=prime[i];
        }
        ansSize++;
        if(n==1) break;
    }
}

猜你喜欢

转载自www.cnblogs.com/LMIx/p/11396931.html
今日推荐