1、给数组初始化ACMJ、组内部预定函数数学问题:1.精度计算大数阶乘2.精度计算乘法(大数乘小数)3.精度计算 乘法(大数乘大数)4.精度计算一一加法5.精度计算一一减法6任意进制转换7.最大公约数、最小公倍数8.组合序列9.快速傅立叶变换(FFT10.Ronberg算法计算积分11.行列式计算12.求排列组合数字符串处理:1.字符串替换2.字符串查找3.字符串截取计算几何:1.叉乘法求任意多边形面积2.求三角形面积3.两矢量间角度4.两点距离(2D 3D)5.射向法判断点是否在多边形内部6.判断点是否在线段上7.判断两线段是否相交8.判断线段与直线是否相交9.点到线段最短距离10.求两直线的交
2、点11.判断一个封闭图形是凹集还是凸集12.Graham扫描法寻找凸包数论:1.x的二进制长度2.返回x的二进制表示中从低到高的第3.模取幕运算4.求解模线性方程5.求解模线性方程组(中国余数定理)6.筛法素数产生器7.判断一个数是否素数图论:1.Prim算法求最小生成树2.Dijkstra 算法求单源最短路径3.Bellma n-ford 算法求单源最短路径4.Floyd算法求每对节点间最短路径排序/查找:1.快速排序2.希尔排序3.选择法排序4.二分查找数据结构:1.顺序队列2.顺序栈3.链表4.链栈5.二叉树一、数学问题1.精度计算 大数阶乘语法:int result=factorial
3、( intn);参数:n: n的阶乘返回值: 阶乘结果的位数本程序直接输出n!的结果,需要返回结 果请保留long a需要math.h源程序:int factorial( int n)long a10000;int i,j,l,c,m=0,w;i 位 a0=1;for(i=1;=n ; c=0;for(j=0;=m;j+) aj=aj*i+c;c=aj/10000;aj=aj%10000;3. 精度计算乘法(大数乘大数) mult(char a,char b,char s);if(c0) m+;am=c;a : 被乘数, 用字符串表示, 位数不限 b : 乘数,用字符串表示,位数不限w=m*4
4、+log10(am)+1;t : 结果,用字符串表示printf(n%ld,am); nullfor(i=m-1;i=0;i-)注意:%4.4ld,ai);空间复杂度为o(n A2)return w;需要 string.hvoid mult(char a,char b,char2. 精度计算乘法(大数乘小数)s) mult(char c,char t,int m);intc : 被乘数, 用字符串表示,位数不限i,j,k=0,alen,blen,sum=0,res6565=0,flag=0;m: 乘数,限定 10 以内char result65;alen=strlen(a);blen=strl
5、en(b);for (i=0;alen;for (j=0;blen;resij=(ai-0)*(bj-);void mult(char c,char t,int m) int i,l,k,flag,add=0;for (i=alen-1;for (j=blen-1;jj-)char s100;sum=sum+resi+blen-j-1j;l=strlen(c);resultk=sum%10;l;k=k+1;sl-i-1=ci-sum=sum/10;for (i=blen-2;k=si*m+add;if(k=10)=i;si=k%10;add=k/10;flag=1;elsesum=sum+re
6、si-jj;si=k;flag=0;add=0;if (flag) l=i+1;si=add;l=i;if (sum!=0) resultk=sum;tl-1-i=si+k;i+) resulti+=tl=0for (i=k-1;si=resultk-1-i;sk=while(1)(strlen(s)!=strlen(a)&s0=) strcpy(s,s+1);break;4.精度计算加法 add(char a,char b,char s); 乘数,用字符串表示,位数不限 t : 结果,用字符串表示 返回值:void add(char a,char b,char back)int i,j,k,
7、up,x,y,z,l;char *c;if (strlen(a)strlen(b)l=strlen(a)+2; else l=strlen(b)+2;c=(char *) malloc(l*sizeof(char); i=strlen(a)-1;j=strlen(b)-1;k=0;up=0;while(i=0|jif(i0) x= else x=ai;if(j9) up=1;z%=10; else up=0;ck+=z+i-;j-;if(up) ck+=1i=0;ck=for(k-=1;kk-)backi+=ck;backi=5.精度计算减法sub(char s1,char s2,char t
8、);s1 : 被减数, 用字符串表示, 位数不限s2 : 减数,用字符串表示,位数不限默认 s 1 =s2 ,程序未处理负数情况void sub(char s1,char s2,char t)int i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);tl1=l1-;for (i=l2-1;i-,l1-)if (s1l1-s2i=0) tl1=s1l1-s2i+tl1=10+s1l1-s2i+ s1l1-1=s1l1-1-1;k=l1;while(s1k=0) tl1=s1l1;loop:if (t0=) l1=strlen(s1); for(i=0;l1-1;ti=t
9、i+1; tl1-1= goto loop; if (num=0) break; i+;i/2;c=s2j;s2j=si-j;s2i-j=c;s2i+1=(strlen(t)=0)t0=t1=7. 最大公约数、最小公倍数语 法 : resulet=hcf(int a,int b) 、6. 任意进制转换result=lcd(int a,int b)语法: conversion(char s1,chars2,long d1,long d2);a: int a ,求最大公约数或最小公倍数b: int b ,求最大公约数或最小公倍数s :原进制数字,用字符串表示 返回最大公约数( hcf )或最转换结
10、果,用字符串表示小公倍数( lcd )d1:原进制数d2:需要转换到的进制数lcd 需要连同 hcf 使用nullint hcf(int a,int b)高于9的位数用大写 AZ表示,216 位进制通过验证int r=0;while(b!voidconversion( char s,chars2,long d1,long d2)long i,j,t,num;char c;num=0;si!=if (si) t=si- else t=si-A+10;num=num*d1+t;t=num%d2;if (t=9) s2i=t+ else s2i=t+-10;num/=d2;return(u*v/h)
11、; m_of_n(int m, int n1, int m1, int* a, int head) 组合数 C 的上参数n1: 组合数 C 的下参数m1: 组合数 C 的上参数,递归之用*a:1n的整数序列数组head:头指针返回值:注意:*a需要自行产生初始调用时, m=m、1 head=0调 用 例 子 : 求 C(m,n) 序 列 m_of_n(m,n,m,a,0);void m_of_n(int m, int n1, int m1, int* a, int head) int i,t;if(m1n1) return; if(m1=n1)for(i=0;m;i+) coutai / 输出
12、序列nreturn;l : 逻辑开关, 0 FFT,1 ifFTil : 逻辑开关, 0 输出按实部 /虚部; 1 输出按模 / 幅角需要 math.h 源程序:void kkfft(pr,pi,n,k,fr,fi,l,il)int n,k,l,il;double pr,pi,fr,fi;int it,m,is,i,j,nv,l0;double p,q,s,vr,vi,poddr,poddi; for (it=0; it=n-1; it+)m=it; is=0; i=k-1; i+)j=m/2; is=2*is+(m-2*j); m=j;frit=pris; fiit=piis;m=m/2;
13、nv=2*nv;for (it=0;=(m-1)*nv;it=it+nv) j=(nv/2)-1; j+)p=prm*j*frit+j+nv/2;q=pim*j*fiit+j+nv/2;s=prm*j+pim*j;s=s*(frit+j+nv/2+fiit+j+nv/2);poddr=p-q;poddi=s-p-q;frit+j+nv/2=frit+j-poddr;fiit+j+nv/2=fiit+j-poddi;frit+j=frit+j+poddr;fiit+j=fiit+j+poddi;if (l!fri=fri/(1.0*n);fii=fii/(1.0*n);if (il!pri=sq
14、rt(fri*fri+fii*fii);(fabs(fri)pii=90.0;else pii=-90.0;pii=atan(fii/fri)*360.0/6.283185306;10.Ronberg 算法计算积分 result=integral(double a,double b);a : 积分上限b : 积分下限function f : 积分函数 f在(a,b )之间的积分值function f(x) 需要自行修改,程序中 用的是 sina(x)/x需要 math.h 默认精度要求是 1e-5 源程序:double f(double x) return sin(x)/x; / 在这里插入被
15、积函数 double integral(double a,double b)double h=b-a;double t1=(1+f(b)*h/2.0;int k=1;double r1,r2,s1,s2,c1,c2,t2; loop:double s=0.0;double x=a+h/2.0; while(x1e-5) r1=r2;c1=c2;return r2; result=js(int s,int n) 参数:s : 行列式存储数组 n: 行列式维数,递归用 返回值: 行列式值函数中常数 N 为行列式维度, 需自行定 义int js(s,n)int sN,n;int z,j,k,r,to
16、tal=0;int bNN;/*bNN 用于存放,在矩阵 sNN 中元素 s0 的余子式 */if(n2)for(z=0;zz+)n-1;j+) for(k=0;k=z)bjk=sj+1k+1; else bjk=sj+1k;if(z%2=0)r=s0z*js(b,n-1); /* 递归调用 */ elser=(-1)*s0z*js(b,n-1);total=total+r;else if(n=2)total=s00*s11-s01*s10Jreturn total; result=P(long n,long m); / result=long C(long n,long m); 排列组合的上
17、系数n: 排列组合的下系数 返回值: 排列组合数符合数学规则:mJ nlong P(long n,long m)long p=1;while(m!p*=n;n-;m-;return p;long C(long n,long m)long i,c=1;i=m;while(i!c*=n;c/=m;return c;二、字符串处理 replace(char str,char key,char swap);str : 在此源字符串进行替换操作 key : 被替换的字符串,不能为空串 swap : 替换的字符串,可以为空串, 为空串表示在源字符中删除 key 返回值:默认 str 长度小于 1000,如
18、否,重新 设定设定 tmp 大小void replace(char str,charkey,char swap)int l1,l2,l3,i,j,flag;char tmp1000;l1=strlen(str);l2=strlen(key);l3=strlen(swap);=l1-l2;l2;if (stri+j!=keyj)flag=0;if (flag)strcpy(tmp,str);strcpy(&tmpi,swap);tmpi+l3,&stri+l2);strcpy(str,tmp);i+=l3-1; result=strfind(char str,char key); 在此源字符串进
19、行查找操作 key : 被查找的字符串,不能为空串 返回值: 如果查找成功,返回 key 在 str 中第一次出现的位置,否则返回 -1int strfind(char str,char key)int l1,l2,i,j,flag; l1=strlen(str);i+) flag=1;=keyj) flag=0;if (flag) return i;return -1; mid(char str,int start,int len,char strback) 操作的目标字符串start : 从第 start 个字符串开始, 截取长 度为 len 的字符len : 从第 start 个字符串开始, 截取长度为 len 的字符strback : 截取的到的字符 0:超出字符串长度,截取失败; 1:截取成功需要 string.h 源程序:int mid(char str,int start,int len,char strback) int l,i,k=0; l=strlen(str);if (start+lenl) return 0;for (i=start;start+len;i+) strbackk+=stri;strbackk=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1