ACM全部算法.docx
- 文档编号:3399053
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:105
- 大小:41.96KB
ACM全部算法.docx
《ACM全部算法.docx》由会员分享,可在线阅读,更多相关《ACM全部算法.docx(105页珍藏版)》请在冰豆网上搜索。
ACM全部算法
我也可以做到..
1/78
目录
一、数学问题..............................................................4
1.精度计算——大数阶乘..................................................4
2.精度计算——乘法(大数乘小数)........................................4
3.精度计算——乘法(大数乘大数)........................................5
4.精度计算——加法......................................................6
5.精度计算——减法......................................................7
6.任意进制转换..........................................................8
7.最大公约数、最小公倍数................................................9
8.组合序列.............................................................10
9.快速傅立叶变换(FFT)................................................10
10.Ronberg算法计算积分.................................................12
11.行列式计算..........................................................14
12.求排列组合数........................................................15
13.求某一天星期几......................................................15
14.卡特兰(Catalan)数列原理............................................16
15.杨辉三角............................................................16
16.全排列..............................................................17
17.匈牙利算法----最大匹配问题............................................18
18.最佳匹配KM算法....................................................20
二、字符串处理...........................................................22
1.字符串替换...........................................................22
2.字符串查找...........................................................23
3.字符串截取...........................................................24
4.LCS-最大公共子串长度.................................................24
5.LCS-最大公共子串长度.................................................25
6.数字转换为字符.......................................................26
三、计算几何.............................................................27
我也可以做到..
2/78
1.叉乘法求任意多边形面积...............................................27
2.求三角形面积.........................................................27
3.两矢量间角度.........................................................28
4.两点距离(2D、3D)...................................................28
5.射向法判断点是否在多边形内部.........................................29
6.判断点是否在线段上...................................................30
7.判断两线段是否相交...................................................31
8.判断线段与直线是否相交...............................................32
9.点到线段最短距离.....................................................32
10.求两直线的交点......................................................33
11.判断一个封闭图形是凹集还是凸集......................................34
12.Graham扫描法寻找凸包...............................................35
13.求两条线段的交点....................................................36
四、数论.................................................................37
1.x的二进制长度........................................................37
2.返回x的二进制表示中从低到高的第i位..................................38
3.模取幂运算...........................................................38
4.求解模线性方程.......................................................39
5.求解模线性方程组(中国余数定理)........................................39
6.筛法素数产生器.......................................................40
7.判断一个数是否素数...................................................41
8.求距阵最大和.........................................................42
8.求一个数每一位相加之和...............................................43
10.质因数分解..........................................................43
11.高斯消元法解线性方程组..............................................44
五、图论.................................................................45
1.Prim算法求最小生成树.................................................45
2.Dijkstra算法求单源最短路径............................................46
3.Bellman-ford算法求单源最短路径........................................47
4.Floyd-Warshall算法求每对节点间最短路径................................48
我也可以做到..
3/78
5.解欧拉图.............................................................49
六、排序/查找............................................................50
1.快速排序.............................................................50
2.希尔排序.............................................................51
3.选择法排序...........................................................52
4.二分查找.............................................................52
七、数据结构.............................................................53
1.顺序队列.............................................................53
2.顺序栈...............................................................56
3.链表.................................................................59
4.链栈.................................................................63
5.二叉树...............................................................66
八、高精度运算专题.......................................................68
1.专题函数说明.........................................................68
2.高精度数比较.........................................................69
3.高精度数加法.........................................................69
4.高精度数减法.........................................................70
5.高精度乘10...........................................................71
6.高精度乘单精度.......................................................71
7.高精度乘高精度.......................................................72
8.高精度除单精度.......................................................72
9.高精度除高精度.......................................................73
九、标准模板库的使用.....................................................74
1.计算求和.............................................................74
2.求数组中的最大值.....................................................76
3.sort和qsort...........................................................76
九、其他.................................................................78
1.运行时间计算..........................................................78
我也可以做到..
4/78
一、数学问题
1.精度计算——大数阶乘
语法:
intresult=factorial(intn);
参数:
n:
n的阶乘
返回值:
阶乘结果的位数
注意:
本程序直接输出n!
的结果,需要返回结果请保留longa[]
需要math.h
源程序:
intfactorial(intn)
{
longa[10000];
inti,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("%4.4ld",a[i]);
returnw;
}
我也可以做到..
5/78
2.精度计算——乘法(大数乘小数)
语法:
mult(charc[],chart[],intm);
参数:
c[]:
被乘数,用字符串表示,位数不限
t[]:
结果,用字符串表示
m:
乘数,限定10以内
返回值:
null
注意:
需要string.h
源程序:
voidmult(charc[],chart[],intm)
{
inti,l,k,flag,add=0;
chars[100];
l=strlen(c);
for(i=0;i s[l-i-1]=c[i]-'0'; for(i=0;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;}elsel=i; for(i=0;i t[l-1-i]=s[i]+'0'; t[l]='\0'; } 3.精度计算——乘法(大数乘大数) 语法: mult(chara[],charb[],chars[]); 参数: a[]: 被乘数,用字符串表示,位数不限 b[]: 乘数,用字符串表示,位数不限 t[]: 结果,用字符串表示 返回值: null 注意: 空间复杂度为o(n^2) 需要string.h 源程序: voidmult(chara[],charb[],chars[]) { 我也可以做到.. 6/78 inti,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0; charresult[65]; alen=strlen(a);blen=strlen(b); for(i=0;i for(j=0;j 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; sum=sum/10; } for(i=blen-2;i>=0;i--) { for(j=0;j<=i;j++)sum=sum+res[i-j][j]; result[k]=sum%10; k=k+1; sum=sum/10; } if(sum! =0){result[k]=sum;k=k+1;} for(i=0;i for(i=k-1;i>=0;i--)s[i]=result[k-1-i]; s[k]='\0'; while (1) { if(strlen(s)! =strlen(a)&&s[0]=='0') strcpy(s,s+1); else break; } } 4.精度计算——加法 语法: add(chara[],charb[],chars[]); 参数: a[]: 被加数,用字符串表示,位数不限 b[]: 加数,用字符串表示,位数不限 s[]: 结果,用字符串表示 返回值: null 注意: 空间复杂度为o(n^2) 我也可以做到.. 7/78 需要string.h 源程序: voidadd(chara[],charb[],charback[]) { inti,j,k,up,x,y,z,l; char*c; if(strlen(a)>strlen(b))l=strlen(a)+2;elsel=strlen(b)+2; c=(char*)malloc(l*sizeof(char)); i=strlen(a)-1; j=strlen(b)-1; k=0;up=0; while(i>=0||j>=0) { if(i<0)x='0';elsex=a[i]; if(j<0)y='0';elsey=b[j]; z=x-'0'+y-'0'; if(up)z+=1; if(z>9){up=1;z%=10;}elseup=0; c[k++]=z+'0'; i--;j--; } if(up)c[k++]='1'; i=0; c[k]='\0'; for(k-=1;k>=0;k--) back[i++]=c[k]; back[i]='\0'; } 5.精度计算——减法 语法: sub(chars1[],chars2[],chart[]); 参数: s1[]: 被减数,用字符串表示,位数不限 s2[]: 减数,用字符串表示,位数不限 t[]: 结果,用字符串表示 返回值: null 注意: 默认s1>=s2,程序未处理负数情况 需要string.h 源程序: voidsub(chars1[],chars2[],chart[]) 我也可以做到.. 8/78 { inti,l2,l1,k; l2=strlen(s2);l1=strlen(s1); t[l1]='\0';l1--; for(i=l2-1;i>=0;i--,l1--) { if(s1[l1]-s2[i]>=0) t[l1]=s1[l1]-s2[i]+'0'; else { t[l1]=10+s1[l1]-s2[i]+'0'; s1[l1-1]=s1[l1-1]-1; } } k=l1; while(s1[k]<0){s1[k]+=10;s1[k-1]-=1;k--;} while(l1>=0){t[l1]=s1[l1];l1--;} loop: if(t[0]=='0') { l1=strlen(s1); for(i=0;i t[l1-1]='\0'; gotoloop; } if(strlen(t)==0){t[0]='0';t[1]='\0';} } 6.任意进制转换 语法: conversion(chars1[],chars2[],chart[]); 参数: s[]: 转换前的数字 s2[]: 转换后的数字 d1: 原进制数 d2: 需要转换到的进制数 返回值: null 注意: 高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证 源程序: voidconversion(chars[],chars2[],longd1,longd2) { 我也可以做到.. 9/78 longi,j,t,num; charc; num=0; for(i=0;s[i]! ='\0';i++) { if(s[i]<='9'&&s[i]>='0')t=s[i]-'0';elset=s[i]-'A'+10; num=num*d1+t; } i=0; while (1) { t=num%d2; if(t<=9)s2[i]=t+'0';elses2[i]=t+'A'-10; num/=d2; if(num==0)break; i++; } for(j=0;j {c=s2[j];s2[j]=s[i-j];s2[i-j]=c;} s2[i+1]='\0'; } 7.最大公约数、最小公倍数 语法: resulet=hcf(inta,intb)、result=lcd(inta,intb) 参数: a: inta,求最大公约数或最小公倍数 b: intb,求最大公约数或最小公倍数 返回值: 返回最大公约数(hcf)或最小公倍数(lcd) 注意: lcd需要连同hcf使用 源程序: inthcf(inta,intb) { intr=0; while(b! =0) { r=a%b; a=b; b=r; } return(a); 我也可以做到.. 10/78 } lcd(intu,intv,inth) { return(u*v/h); } 8.组合序列 语法: m_of_n(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 全部 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)