ACM全部算法Word格式文档下载.docx
《ACM全部算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ACM全部算法Word格式文档下载.docx(105页珍藏版)》请在冰豆网上搜索。
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;
l;
s[l-i-1]=c[i]-'
0'
;
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;
t[l-1-i]=s[i]+'
t[l]='
\0'
3.精度计算——乘法(大数乘大数)
mult(chara[],charb[],chars[]);
a[]:
b[]:
乘数,用字符串表示,位数不限
空间复杂度为o(n^2)
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);
alen;
for(j=0;
blen;
j++)res[i][j]=(a[i]-'
)*(b[j]-'
);
for(i=alen-1;
i--)
for(j=blen-1;
j>
j--)sum=sum+res[i+blen-j-1][j];
result[k]=sum%10;
k=k+1;
sum=sum/10;
for(i=blen-2;
=i;
j++)sum=sum+res[i-j][j];
if(sum!
=0){result[k]=sum;
k;
i++)result[i]+='
for(i=k-1;
i--)s[i]=result[k-1-i];
s[k]='
while
(1)
if(strlen(s)!
=strlen(a)&
&
s[0]=='
)
strcpy(s,s+1);
else
break;
4.精度计算——加法
add(chara[],charb[],chars[]);
被加数,用字符串表示,位数不限
加数,用字符串表示,位数不限
s[]:
7/78
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='
elsex=a[i];
if(j<
0)y='
elsey=b[j];
z=x-'
+y-'
if(up)z+=1;
if(z>
9){up=1;
z%=10;
}elseup=0;
c[k++]=z+'
i--;
j--;
if(up)c[k++]='
1'
i=0;
c[k]='
for(k-=1;
k>
k--)
back[i++]=c[k];
back[i]='
5.精度计算——减法
sub(chars1[],chars2[],chart[]);
s1[]:
被减数,用字符串表示,位数不限
s2[]:
减数,用字符串表示,位数不限
默认s1>
=s2,程序未处理负数情况
voidsub(chars1[],chars2[],chart[])
8/78
inti,l2,l1,k;
l2=strlen(s2);
l1=strlen(s1);
t[l1]='
l1--;
for(i=l2-1;
i--,l1--)
if(s1[l1]-s2[i]>
t[l1]=s1[l1]-s2[i]+'
t[l1]=10+s1[l1]-s2[i]+'
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];
loop:
if(t[0]=='
l1-1;
i++)t[i]=t[i+1];
t[l1-1]='
gotoloop;
if(strlen(t)==0){t[0]='
t[1]='
6.任意进制转换
conversion(chars1[],chars2[],chart[]);
转换前的数字
转换后的数字
d1:
原进制数
d2:
需要转换到的进制数
高于9的位数用大写'
A'
~'
Z'
表示,2~16位进制通过验证
voidconversion(chars[],chars2[],longd1,longd2)
9/78
longi,j,t,num;
charc;
num=0;
s[i]!
='
if(s[i]<
9'
s[i]>
)t=s[i]-'
elset=s[i]-'
+10;
num=num*d1+t;
t=num%d2;
if(t<
=9)s2[i]=t+'
elses2[i]=t+'
-10;
num/=d2;
if(num==0)break;
i++;
i/2;
{c=s2[j];
s2[j]=s[i-j];
s2[i-j]=c;
s2[i+1]='
7.最大公约数、最小公倍数
resulet=hcf(inta,intb)、result=lcd(inta,intb)
a:
inta,求最大公约数或最小公倍数
b:
intb,求最大公约数或最小公倍数
返回最大公约数(hcf)或最小公倍数(lcd)
lcd需要连同hcf使用
inthcf(inta,intb)
intr=0;
while(b!
r=a%b;
a=b;
b=r;
return(a);
10/78
lcd(intu,intv,inth)
return(u*v/h);
8.组合序列
m_of_n(int