ImageVerifierCode 换一换
格式:DOCX , 页数:58 ,大小:35.12KB ,
资源ID:12846242      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12846242.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ACM小组内部预定函数.docx)为本站会员(b****0)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ACM小组内部预定函数.docx

1、ACM小组内部预定函数ACM小组内部预定函数Ver 2.0 by IcyFenix数学问题:1.精度计算大数阶乘2.精度计算乘法(大数乘小数)3.精度计算乘法(大数乘大数)4.精度计算加法5.精度计算减法6.任意进制转换7.最大公约数、最小公倍数8.组合序列9.快速傅立叶变换(FFT) 10.Ronberg算法计算积分11.行列式计算12.求排列组合数字符串处理:1.字符串替换2.字符串查找3.字符串截取计算几何:1.叉乘法求任意多边形面积2.求三角形面积3.两矢量间角度4.两点距离(2D、3D)5.射向法判断点是否在多边形内部6.判断点是否在线段上7.判断两线段是否相交8.判断线段与直线是否

2、相交9.点到线段最短距离10.求两直线的交点11.判断一个封闭图形是凹集还是凸集12.Graham扫描法寻找凸包数论:1.x的二进制长度2.返回x的二进制表示中从低到高的第i位3.模取幂运算4.求解模线性方程5.求解模线性方程组(中国余数定理)6.筛法素数产生器7.判断一个数是否素数图论:1.Prim算法求最小生成树2.Dijkstra算法求单源最短路径3.Bellman-ford算法求单源最短路径4.Floyd算法求每对节点间最短路径排序/查找:1.快速排序2.希尔排序3.选择法排序4.二分查找数据结构:1.顺序队列2.顺序栈3.链表4.链栈5.二叉树一、数学问题1.精度计算大数阶乘语法:i

3、nt result=factorial(int n);参数:n:n 的阶乘返回值:阶乘结果的位数注意:本程序直接输出n!的结果,需要返回结果请保留long a需要 math.h源程序:int factorial(int n)long a10000;int i,j,l,c,m=0,w; a0=1; for(i=1;i=n;i+) c=0; for(j=0;j0) m+;am=c; w=m*4+log10(am)+1;printf(n%ld,am); for(i=m-1;i=0;i-) printf(%4.4ld,ai);return w; 2.精度计算乘法(大数乘小数)语法:mult(char

4、c,char t,int m);参数:c:被乘数,用字符串表示,位数不限t:结果,用字符串表示m:乘数,限定10以内返回值:null注意:需要 string.h源程序:void mult(char c,char t,int m)int i,l,k,flag,add=0;char s100;l=strlen(c);for (i=0;il;i+)sl-i-1=ci-0; for (i=0;i=10) si=k%10;add=k/10;flag=1; else si=k;flag=0;add=0;if (flag) l=i+1;si=add; else l=i;for (i=0;il;i+)tl-1

5、-i=si+0;tl=0;3.精度计算乘法(大数乘大数)语法:mult(char a,char b,char s);参数:a:被乘数,用字符串表示,位数不限b:乘数,用字符串表示,位数不限t:结果,用字符串表示返回值:null注意:空间复杂度为 o(n2)需要 string.h源程序:void mult(char a,char b,char s)int i,j,k=0,alen,blen,sum=0,res6565=0,flag=0;char result65;alen=strlen(a);blen=strlen(b); for (i=0;ialen;i+)for (j=0;j=0;i-)fo

6、r (j=blen-1;j=0;j-) sum=sum+resi+blen-j-1j;resultk=sum%10;k=k+1;sum=sum/10;for (i=blen-2;i=0;i-)for (j=0;j=i;j+) sum=sum+resi-jj;resultk=sum%10;k=k+1;sum=sum/10;if (sum!=0) resultk=sum;k=k+1;for (i=0;i=0;i-) si=resultk-1-i;sk=0;while(1)if (strlen(s)!=strlen(a)&s0=0) strcpy(s,s+1);elsebreak;4.精度计算加法语

7、法:add(char a,char b,char s);参数:a:被乘数,用字符串表示,位数不限b:乘数,用字符串表示,位数不限t:结果,用字符串表示返回值:null注意:空间复杂度为 o(n2)需要 string.h源程序:void add(char a,char b,char back)int i,j,k,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=

8、0;while(i=0|j=0)if(i0) x=0;else x=ai;if(j9) up=1;z%=10;else up=0;ck+=z+0;i-;j-;if(up) ck+=1;i=0;ck=0;for(k-=1;k=0;k-)backi+=ck;backi=0; 5.精度计算减法语法:sub(char s1,char s2,char t);参数:s1:被减数,用字符串表示,位数不限s2:减数,用字符串表示,位数不限t:结果,用字符串表示返回值:null注意:默认s1=s2,程序未处理负数情况需要 string.h源程序:void sub(char s1,char s2,char t)i

9、nt i,l2,l1,k;l2=strlen(s2);l1=strlen(s1);tl1=0;l1-;for (i=l2-1;i=0;i-,l1-)if (s1l1-s2i=0) tl1=s1l1-s2i+0;elsetl1=10+s1l1-s2i+0;s1l1-1=s1l1-1-1;k=l1;while(s1k=0) tl1=s1l1;l1-;loop:if (t0=0) l1=strlen(s1);for (i=0;il1-1;i+) ti=ti+1;tl1-1=0;goto loop;if (strlen(t)=0) t0=0;t1=0; 6.任意进制转换语法:conversion(ch

10、ar s1,char s2,long d1,long d2);参数:s:原进制数字,用字符串表示s2:转换结果,用字符串表示d1:原进制数d2:需要转换到的进制数返回值:null注意:高于9的位数用大写AZ表示,216位进制通过验证源程序:void conversion(char s,char s2,long d1,long d2)long i,j,t,num;char c;num=0;for (i=0;si!=0;i+)if (si=0) t=si-0; else t=si-A+10;num=num*d1+t;i=0;while(1)t=num%d2;if (t=9) s2i=t+0; el

11、se s2i=t+A-10;num/=d2;if (num=0) break;i+;for (j=0;ji/2;j+)c=s2j;s2j=si-j;s2i-j=c;s2i+1=0;7.最大公约数、最小公倍数语法:resulet=hcf(int a,int b)、result=lcd(int a,int b)参数:a:int a,求最大公约数或最小公倍数b:int b,求最大公约数或最小公倍数返回值:返回最大公约数(hcf)或最小公倍数(lcd)注意:lcd 需要连同 hcf 使用源程序:int hcf(int a,int b)int r=0;while(b!=0)r=a%b;a=b;b=r;r

12、eturn(a); lcd(int u,int v,int h)return(u*v/h);8.组合序列语法:m_of_n(int m, int n1, int m1, int* a, int head)参数:m:组合数C的上参数n1:组合数C的下参数m1:组合数C的上参数,递归之用*a:1n的整数序列数组head:头指针返回值:null注意:*a需要自行产生初始调用时,m=m1、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(

13、m1n1) return; if(m1=n1) for(i=0;im;i+) coutai ; / 输出序列 coutn; return; m_of_n(m,n1-1,m1,a,head); / 递归调用 t=ahead;ahead=an1-1+head;an1-1+head=t;m_of_n(m,n1-1,m1-1,a,head+1); / 再次递归调用 t=ahead;ahead=an1-1+head;an1-1+head=t; 9.快速傅立叶变换(FFT)语法:kkfft(double pr,double pi,int n,int k,double fr,double fi,int l,

14、int il);参数:prn:输入的实部 pin:数入的虚部n,k:满足n=2kfrn:输出的实部fin:输出的虚部l:逻辑开关,0 FFT,1 ifFTil:逻辑开关,0 输出按实部/虚部;1 输出按模/幅角 返回值:null注意:需要 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; for (i=0; i=

15、k-1; i+) j=m/2; is=2*is+(m-2*j); m=j;frit=pris; fiit=piis; pr0=1.0; pi0=0.0; p=6.283185306/(1.0*n); pr1=cos(p); pi1=-sin(p); if (l!=0) pi1=-pi1; for (i=2; i=n-1; i+) p=pri-1*pr1; q=pii-1*pi1; s=(pri-1+pii-1)*(pr1+pi1); pri=p-q; pii=s-p-q; for (it=0; it=0; l0-) m=m/2; nv=2*nv; for (it=0; it=(m-1)*nv;

16、 it=it+nv) for (j=0; 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!=0) for (i=0; i=n-1; i+) fri=fri/(1.0*n); fii=fii/(

17、1.0*n); if (il!=0) for (i=0; i=n-1; i+) pri=sqrt(fri*fri+fii*fii); if (fabs(fri)0) pii=90.0; else pii=-90.0; else pii=atan(fii/fri)*360.0/6.283185306; return; 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; /在这里插入被积函数 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;k+;h/=2.0; t1=t2;s1=s2; goto loop; return r2; 11.行列

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1