/********************************************************************** * FileName:mymath.h * Author:coder4101 * Last Update:2014/1/27 9:50 * 备注:自己写的模板,欢迎大家提各种意见和建议。 随着知识的日积月累,我也会慢慢丰富模板内容和提高代码质量。 *********************************************************************/ #include <cstdlib> #include <cmath> #define Pi 3.14159265358979323846 int isleap(int y) {return (y%4==0)&&(y%100!=0)||y%400==0;} /* 闰年判断函数 */ template<typename T> int isprime(T x) { int logo=0,i,m; if( x==2||x==3 ) logo = 1; else if( (x>4)&&(x%2) ) { m = int(sqrt(double(x))); for(i=3;(i<=m)&&(x%i);i+=2); if( i>m ) logo = 1; } return logo; } template<typename T> T gcd(T x,T y) /* 求 x,y的最大公约数 */ { T r=1; while(r) {r=x%y;x=y;y=r;} return x; } template<typename T> T lcm(T x,T y){ return x*y/gcd(x,y); } /* 求 a,b最小公倍数 */ // 辗转相除——递推法求多个数的最大公约数 template<typename T> T gcd1(T a[]) { T i,t; t = gcd(a[1],a[2]); for(i=3;i<=a[0];i++) t = gcd(t,a[i]); return t; } template<typename T> T lcm1(T a[]) { T i,t; t = lcm(a[1],a[2]); for(i=3;i<=a[0];i++) t = lcm(t,a[i]); return t; } // 生成组合数,最大到C(33,16) void combin(int c[][35]) { int i, j; for(i=0;i<=33;i++) c[i][0]=c[i][i]=1; for(i=1;i<=33;i++) for(j=1;j<i;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; } // 写于2014/1/6 16:17 template<typename T1,typename T2> double polyval(int n,T1 a[],T2 x) {// n是最高项大小,a[]存储系数,x是要求的值 int i; double sum=0,t=1; for(i=0;i<=n;i++) sum+=a[i]*t,t*=x; return sum; } // 以下两函数是多进制与10进制之间的互换,变量名通用 // v是十进制的值 // m为另一进制数,a是其相应的系数矩阵,n为其最高位m对应的次幂 int encode(int n,int a[],int m) {// (函数原理同polyval) int i,v=0,t=1; for(i=0;i<=n;i++) v+=a[i]*t,t*=m; return v; } int decode(int v,int a[],int m) { int n=log(v)/log(m),t=n; do{a[n-t]=v%m;v/=m;}while(t--); return n; } // 函数全名:is_unique_digit template<typename T> int isudig(T v) {// 判断数字0~9是否出现不超过1次 int i, a[10]={0}; while(v) a[v%10]++,v/=10; for(i=0;i<10;i++) if(a[i]>1) return 0; return 1; }