数学知识及其相关算法.docx
- 文档编号:25255215
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:49
- 大小:41.28KB
数学知识及其相关算法.docx
《数学知识及其相关算法.docx》由会员分享,可在线阅读,更多相关《数学知识及其相关算法.docx(49页珍藏版)》请在冰豆网上搜索。
数学知识及其相关算法
数学知识及其相关算法
第一章有关数论的算法2
1.1最大公约数与最小公倍数2
1.2有关素数的算法2
1.3方程ax+by=c的整数解及应用5
1.4求a^bmodn7
第二章高精度计算8
2.1高精度加法8
2.2高精度减法10
2.3高精度乘法12
2.4高精度除法15
练习20
第三章排列与组合20
3.1加法原理与乘法原理20
练习:
20
3.2排列与组合的概念与计算公式21
练习:
21
3.3排列与组合的产生算法22
练习25
第四章计算几何25
4.1基础知识25
4.2线段的相交判断26
4.3寻找凸包算法27
练习30
第五章其它数学知识及算法30
5.1鸽巢原理30
5.2 容斥原理及应用31
5.3常见递推关系及应用31
第一章有关数论的算法
1.1最大公约数与最小公倍数
functiongcd(a,b:
longint):
longint;
begin
ifamodb=0thengcd:
=belsegcd:
=gcd(b,amodb);
end;
1.算法1:
欧几里德算法求a,b的最大公约数
functiongcd(a,b:
longint):
longint;
begin
ifb=0thengcdd:
=a
elsegcd:
=gcd(b,amodb);
end;
2.算法2:
最小公倍数acm=a*bdivgcd(a,b);
3.算法3:
扩展的欧几里德算法,求出gcd(a,b)和满足gcd(a,b)=ax+by的整数x和y (一组解)
functionexgcd(a,b:
longint;varx,y:
longint):
longint;
vart:
longint;
begin
ifb=0then beginexgcd:
=a;x:
=1; y:
=0; end
else
begin
exgcdt:
=exgcd(b,amodb,x,y);
t:
=x; x:
=y; y:
=t-(adivb)*y;
end;
end;
(理论依据:
gcd(a,b)=ax+by=bx1+(amodb)y1=bx1+(a-(adivb)*b)y1=ay1+b(x1-(adivb)*y1))
1.2有关素数的算法
1.算法4:
求前n个素数:
programBasicMath_Prime;
constmaxn=1000;
varpnum,n:
longint;
p:
array[1..maxn]oflongint;
functionIsPrime(x:
longint):
boolean;
vari:
integer;
begin
fori:
=1topnumdo
ifsqr(p[i])<=xthen
begin
ifxmodp[i]=0thenbeginIsPrime:
=false;exit; end;
end
else begin IsPrime:
=true; exit; end;
IsPrime:
=true;
end;
proceduremain;
varx:
longint;
begin
pnum:
=0;x:
=1;
while(pnum begin inc(x); ifIsPrime(x)then begin inc(pnum); p[pnum]: =x; end; end; end; procedureout; vari,t: integer; begin fori: =1tondo begin write(p[i]: 5);t: =t+1; iftmod10=0thenwriteln; end; end; beginreadln(n);main;out;end. 2.算法5: 求不大于n的所有素数 programsushu3; constmaxn=10000; vari,k,n: integer; a: array[1..maxn]ofinteger; begin readln(n); fori: =1tondoa[i]: =i; a[1]: =0;i: =2; whilei begin k: =2*i; whilek<=ndo begin a[k]: =0; k: =k+i; end; i: =i+1; while(a[i]=0)and(i =i+1; end; k: =0; fori: =1tondo ifa[i]<>0 then begin write(a[i]: 5);k: =k+1; ifkmod10=0thenwriteln; end end. 3.算法6: 将整数分解质因数的积 programBasicMath_PolynomialFactors; const maxp=1000; var pnum,n: longint; num,p: array[1..maxp]oflongint; proceduremain; varx: longint; begin fillchar(num,sizeof(num),0); fillchar(p,sizeof(p),0); pnum: =0; x: =1; while(n>1)do begin inc(x); ifnmodx=0then begin inc(pnum); p[pnum]: =x; while(nmodx=0)do begin n: =ndivx; inc(num[pnum]); end; end; end; end; procedureout; varj,i: integer; begin fori: =1topnumdo forj: =1tonum[i]do write(p[i]: 5); writeln; end; begin main; out; end. 1.3方程ax+by=c的整数解及应用 1.算法7: 求方程ax+by=c的整数解 procedureequation(a,b,c: longint;varx0,y0: longint); vard,x,y: longint; begin d: =exgcd(a,b,x,y); ifcmodd>0then begin writeln('noanswer'); halt; endelse begin x0: =x*(cdivd); y0: =y*(cdivd); end; end; 2.方程ax+by=c整数解的应用 例1: 有三个分别装有a升水、b升水和c升水的量筒(gcd(a,b)=1,c>b>a>0),现c筒装满水, 问能否在c筒个量出d升水(c>d>0)。 若能,请列出一种方案。 算法分析: 量水过程实际上就是倒来倒去,每次倒的时候总有如下几个持点: 1.总有一个筒中的水没有变动; 2.不是一个筒被倒满就是另一个筒被倒光; 3.c筒仅起中转作用,而本身容积除了必须足够装下a简和b简的全部水外,别无其 它限制。 程序如下: programmw; type node=array[0..1]oflongint; var a,b,c: node; d,step,x,y: longint; functionexgcd(a,b: longint;varx,y: longint): longint; vart: longint; begin ifb=0then begin exgcd: =a;;x: =1;y: =0; end else begin exgcd: =exgcd(b,amodb,x,y); t: =x;x: =y;y: =t-(adivb)*y end; end; procedureequation(a,b,c: longint;varx0,y0: longint); vard,x,y: longint; begin d: =exgcd(a,b,x,y); ifcmodd>0then begin writeln('noanswer'); halt; endelse begin x0: =x*(cdivd); y0: =y*(cdivd); end; end; procedurefill(vara,b: node); vart: longint; begin ifa[1] =a[1] elset: =b[0]-b[1]; a[1]: =a[1]-t; b[1]: =b[1]+t end; begin write('a,b,c,d='); readln(a[0],b[0],c[0],d); equation(a[0],b[0],d,x,y); step: =0; a[1]: =0;b[1]: =0;c[1]: =c[0]; writeln(step: 5,': ',a[1]: 5,b[1]: 5,c[1]: 5); ifx>0then repeat ifa[1]=0thenfill(c,a)else ifb[1]=b[0]thenfill(b,c)elsefill(a,b); inc(step); writeln(step: 5,': ',a[1]: 5,b[1]: 5,c[1]: 5); untilc[1]=d else repeat ifb[1]=0thenfill(c,b)else ifa[1]=a[0]thenfill(a,c)elsefill(b,a); inc(step); writeln(step: 5,': ',a[1]: 5,b[1]: 5,c[1]: 5); untilc[1]=d; end. 1.4求a^bmodn 1.算法8: 直接叠代法求a^bmodn functionf(a,b,n: longint): longint; vard,i: longint; begin d: =a; fori: =2tobdod: =dmodn*a; d: =dmodn; f: =d; end; 2.算法9: 加速叠代法 functionf(a,b,n: longint): longint; vard,t: longint; begin d: =1;t: =a; whileb>0do begin ift=1thenbegin f: =d;exitend ; ifbmod2=1thend: =d*tmodn; b: =bdiv2; t: =t*tmodn; end; f: =d end; 第二章高精度计算 2.1高精度加法 高精度加法程序如下: programHighPrecision1_Plus; const fn_inp='hp1.inp'; fn_out='hp1.out'; maxlen=100; {maxlengthofthenumber} type hp=record len: integer;{lengthofthenumber} s: array[1..maxlen]ofinteger {s[1] isthelowest position s[len]isthehighestposition} end; var x: array[1..2]ofhp; y: hp;{x: input;y: output} procedurePrintHP(constp: hp); vari: integer; begin fori: =p.lendownto1dowrite(p.s[i]); end; procedureinit; var st: string; j,i: integer; begin assign(input,fn_inp); reset(input); forj: =1to2do begin readln(st); x[j].len: =length(st); fori: =1tox[j].lendo{changestringtoHP} x[j].s[i]: =ord(st[x[j].len+1-i])-ord('0'); end; close(input); end; procedurePlus(a,b: hp;varc: hp);{c: =a+b} vari,len: integer; begin fillchar(c,sizeof(c),0); ifa.len>b.lenthenlen: =a.len {getthebiggerlengthofa,b} elselen: =b.len; fori: =1tolendo{plusfromlowtohigh} begin inc(c.s[i],a.s[i]+b.s[i]); ifc.s[i]>=10then begin dec(c.s[i],10); inc(c.s[i+1]);{add1toahigherposition} end; end; ifc.s[len+1]>0theninc(len); c.len: =len; end; proceduremain; begin Plus(x[1],x[2],y); end; procedureout; begin assign(output,fn_out); rewrite(output); PrintHP(y); writeln; close(output); end; begin init; main; out; end. 2.2高精度减法 高精度减法程序如下: programHighPrecision2_Subtract; const fn_inp='hp2.inp'; fn_out='hp2.out'; maxlen=100; {maxlengthofthenumber} type hp=record len: integer;{lengthofthenumber} s: array[1..maxlen]ofinteger {s[1] isthelowest position s[len]isthehighestposition} end; var x: array[1..2]ofhp; y: hp;{x: input;y: output} positive: boolean; procedurePrintHP(constp: hp); vari: integer; begin fori: =p.lendownto1dowrite(p.s[i]); end; procedureinit; var st: string; j,i: integer; begin assign(input,fn_inp); reset(input); forj: =1to2do begin readln(st); x[j].len: =length(st); fori: =1tox[j].lendo{changestringtoHP} x[j].s[i]: =ord(st[x[j].len+1-i])-ord('0'); end; close(input); end; procedureSubtract(a,b: hp;varc: hp);{c: =a-b,supposea>=b} vari,len: integer; begin fillchar(c,sizeof(c),0); ifa.len>b.lenthenlen: =a.len {getthebiggerlengthofa,b} elselen: =b.len; fori: =1tolendo{subtractfromlowtohigh} begin inc(c.s[i],a.s[i]-b.s[i]); ifc.s[i]<0then begin inc(c.s[i],10); dec(c.s[i+1]);{add1toahigherposition} end; end; while(len>1)and(c.s[len]=0)dodec(len); c.len: =len; end; functionCompare(consta,b: hp): integer; { 1ifa>b 0ifa=b -1ifa } varlen: integer; begin ifa.len>b.lenthenlen: =a.len {getthebiggerlengthofa,b} elselen: =b.len; while(len>0)and(a.s[len]=b.s[len])dodec(len); {findapositionwhichhaveadifferentdigit} iflen=0thencompare: =0{nodifference} elsecompare: =a.s[len]-b.s[len]; end; proceduremain; begin ifCompare(x[1],x[2])<0thenpositive: =false elsepositive: =true; ifpositivethenSubtract(x[1],x[2],y) elseSubtract(x[2],x[1],y); end; procedureout; begin assign(output,fn_out); rewrite(output); ifnotpositivethenwrite('-'); PrintHP(y); writeln; close(output); end; begin init; main; out; end. 2.3高精度乘法 1.高精度乘单精度(1位数) 程序如下: programHighPrecision3_Multiply1; const fn_inp='hp3.inp'; fn_out='hp3.out'; maxlen=100; {maxlengthofthenumber} type hp=record len: integer;{lengthofthenumber} s: array[1..maxlen]ofinteger {s[1] isthelowest position s[len]isthehighestposition} end; var x,y: hp; {x: inputhp;y: output} z: integer;{z: inputlp} procedurePrintHP(constp: hp); vari: integer; begin fori: =p.lendownto1dowrite(p.s[i]); end; procedureinit; var st: string; i: integer; begin assign(input,fn_inp); reset(input); readln(st); x.len: =length(st); fori: =1tox.lendo{changestringtoHP} x.s[i]: =ord(st[x.len+1-i])-ord('0'); readln(z); close(input); end; procedureMultiply(a: hp;b: integer;varc: hp);{c: =a*b} vari,len: integer; begin fillchar(c,sizeof(c),0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数学知识 及其 相关 算法