文档介绍:ACM 小组内部预定函数 Ver by IcyFenix 数学问题: ——大数阶乘 ——乘法(大数乘小数) ——乘法(大数乘大数) ——加法 ——减法 、最小公倍数 ( FFT ) g算法计算积分 11. 行列式计算 12. 求排列组合数字符串处理: : ( 2D、 3D) 10. 求两直线的交点 11. 判断一个封闭图形是凹集还是凸集 扫描法寻找凸包数论: 的二进制长度 x的二进制表示中从低到高的第 i位 (中国余数定理) : m算法求最小生成树 a算法求单源最短路径 -for d算法求单源最短路径 算法求每对节点间最短路径排序/ 查找: : 、数学问题 ——大数阶乘语法: int result=factorial( int n); 参数: n:n的阶乘返回值: 阶乘结果的位数注意: 本程序直接输出 n!的结果,需要返回结果请保留 long a[] 需要 源程序: int factorial( int n) { long a[10000]; int i,j,l,c,m=0,w; a[0]=1; for (i=1;i<=n;i++) { c=0; for (j=0;j<=m;j++) { a[j]=a[j]*i+c; c=a[j]/10000; a[j]=a[j]%10000; } if (c>0) {m++;a[m]=c;} } w=m*4+log10(a[m])+1; printf("\n%ld",a[m]); for (i=m-1;i>=0;i--) printf("%",a[i]); return w; } ——乘法(大数乘小数) 语法: mult( char c[], char t[], int m); 参数: c[] :被乘数,用字符串表示,位数不限 t[] :结果,用字符串表示 m:乘数,限定 10以内返回值: null 注意: 需要 源程序: void mult( char c[], char t[], int m) { int i,l,k,flag,add=0; char s[100]; l=strlen(c); for (i=0;i<l;i++) s[l-i-1]=c[i]-'0'; for (i=0;i<l;i++) { k=s[i]*m+add; if (k>=10) {s[i]=k%10;add=k/10;flag=1;} else {s[i]=k;flag=0;add=0;} } if (flag) {l=i+1;s[i]=add;} else l=i; for (i=0;i<l;i++) t[l-1-i]=s[i]+'0'; t[l]='\0'; } ——乘法(大数乘大数) 语法: mult( char a[], char b[], char s[]); 参数: a[] :被乘数,用字符串表示,位数不限 b[] :乘数,用字符串表示,位数不限 t[] :结果,用字符串表示返回值: null 注意: 空间复杂度为 o(n^2) 需要 源程序: void mult( char a[], char b[], char s[]) { int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; char result[65]; alen=strlen(a);blen=strlen(b); for (i=0;i<alen;i++) for (j=0;j<blen;j++) res[i][j]=(a[i]-'0')*(b[j]-'0'); for (i=alen-1;i>=0;i--) { for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j]; result[k]=sum%10; k=k+1; su