数学类问题
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; } }