pascal常用子程序.docx
- 文档编号:7651195
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:44
- 大小:27.92KB
pascal常用子程序.docx
《pascal常用子程序.docx》由会员分享,可在线阅读,更多相关《pascal常用子程序.docx(44页珍藏版)》请在冰豆网上搜索。
pascal常用子程序
一、常用算法子程序
基本数学类:
(1)两个变量交换数值:
procedureswap(a,b:
integer;varc,d:
integer);
begin
c:
=b;d:
=a;
end;
(2)两组数据交换数值:
procedureswap(i,j:
integer;);//传入两个数组的下标
vark,l:
integer;
begin
fork:
=1tondo
begin
l:
=a[i,k];a[i,k]:
=a[j,k];a[j,k]:
=l;
end;
end;
(3)求两数的最大值:
functionmax(a,b:
integer):
integer;
begin
Ifa>bthenmax:
=aelsemax:
=b;
end;
(4)求一组数的最小值:
functionmin(a:
arr)ofinteger;
vari:
integer;
begin
min:
=maxint;
fori:
=1toa[0]do
ifmin>a[i]thenmin:
=a[i];
end;
(5)求两个数的最大公约数:
function gcd(a,b:
integer):
integer;
begin
if b=0 then gcd:
=a
else gcd:
=gcd(b,a mod b);
end ;
(6)判断一个数是否是素数
function prime (n:
integer):
Boolean;
var i:
integer;
begin
for i:
=2 to trunc(sqrt(n)) do
if n mod i=0 then
begin
prime:
=false; exit;
end;
prime:
=true;
end;
(7)求出1~n范围内的所有素数
proceduregetprime(n:
longint;vara:
arr);
vari,j,l:
longint;
t:
array[1..50000]ofboolean;
begin
fillchar(t,sizeof(t),true);
t[1]:
=false;i:
=2;
whilei begin ifp[i]then begin j: =i*2; whilej =false;inc(j,i);end; end; inc(i); end; l: =0; fori: =1tondo ift[i]thenbegininc(l);a[l]: =i;end; a[0]: =l; end; 1、进位制转换: (1)十进制转k进制: ///////////////////////////////////////////////////////整数/////////////////////////////////////////////////////////////// proceduretrans_10_k(n,k: longint;vara: arr); vari: longint; begin fillchar(a,sizeof(a),0); whilen<>0do begin inc(a[0]);a[a[0]]: =nmodk;n: =ndivk; end; Ifa[0]=0thena[0]: =1; end; /////////////////////////////////////////////////////////小数/////////////////////////////////////////////////////////// proceduretrans_10_k(m: real;l,k: integer;vara: arr);//小数(l=16时相当于十进 //制的第5位) begin fillchar(a,sizeof(a),0); while(m<>0)and(a[0]<=l)do begin m: =m*k;inc(a[0]);a[a[0]]: =trunc(m);m: =m-a[a[0]]; end; end; (2)k进制转十进制: /////////////////////////////////////////////////////////////整数//////////////////////////////////////////////////////// functiontrans_k_10(k: integer;a: arr): longint; vari,j: longint; begin j: =1;trans_k_10: =0; fori: =1toa[0]do begin trans_k_10: =trans_k_10+a[i]*j; j: =j*k; end; end; ////////////////////////////////////////////////////////////小数//////////////////////////////////////////////////////// functiontrans_k_10(k: integer;a: arr): real; varl: real; i: integer; begin l: =1; fori: =1toa[0]do begin l: =l/k;trans_k_10: =trans_k_10+a[i]*l; end; end; (1)高精度数m进制转成高精度n进制: procedurechu_m_n(a: arr;m,n: integer;varb: arr;vary: integer); vari: integer; begin y: =0; fori: =a[0]downto1do begin y: =y*m+a[i];b[i]: =ydivn;y: =ymodn; end; b[0]: =a[0]; whileb[b[0]]=0dodec(b[0]);ifb[0]<1thenb[0]: =1; end; //////////////////////////////////////////////////////////////////////////////////////////////////// proceduretrans_m_n(a: arr;m,n: integer;varb: arr); vari,j,k: integer; begin fillchar(b,sizeof(b),0); whilenot((a[0]=1)and(a[1]=0))do begin inc(b[0]);chu_m_n(a,m,n,a,b[b[0]]); end; end; (2)2进制转换成2k进制(如: 8进制(k=3)、16进制(k=4)) proceduretrans_2_2k(a: arr;k: integer;varb: arr); vari,j: integer; wq: array[1..10]oflongint; begin wq[1]: =1;fori: =2tokdowq[i]: =wq[i-1]*2; fillchar(b,sizeof(b),0); fori: =1toa[0]divk+1do forj: =1tokdob[i]: =b[i]+a[(i-1)*k+j]*wq[j]; b[0]: =a[0]divk+1; whileb[b[0]]=0dodec(b[0]);ifb[0]<1thenb[0]: =1; end; (6)2k进制转换成2进制: proceduretrans_2k_2(a: arr;k: integer;varb: arr); vari,j,l: integer; begin fillchar(b,sizeof(b),0);l: =0; fori: =1toa[0]do forj: =1tokdo begin b[(i-1)*k+j]: =a[i]mod2;a[i]: =a[i]div2; end; b[0]: =a[0]*k; whileb[b[0]]=0dodec(b[0]);ifb[0]<1thenb[0]: =1; end; 2、高精度计算: 以下标程均为十进制,如改为10n进制可提高n倍速度。 (1)高精度数大小比较 functiona_dy_b(a,b: arr): boolean; vari: integer; begin i: =a[0]; ifa[0]<>b[0]thena_dy_b: =a[0]>b[0] elsebegin while(a[i]=b[i])and(i>0)dodec(i); a_dy_b: =a[i]>b[i]; end; end; (2)高精度+低精度 procedureadd_h_l(a: arr;b: integer;varc: arr); vari: integer; begin a[1]: =a[1]+b; fori: =1toa[0]do begin a[i+1]: =a[i+1]+a[i]div10; a[i]: =a[i]mod10; end; c: =a; c[0]: =max(c[0],19); whilec[c[0]]=0dodec(c[0]) end; (3)高精度+高精度 procedureadd_h_h(a,b: arr;varc: arr); vari,j: integer; begin fillchar(c,sizeof(c),0); ifa[0]>b[0]thenj: =a[0]elsej: =b[0]; fori: =1tojdoc[i]: =a[i]+b[i]; fori: =1tojdo begin c[i+1]: =c[i+1]+c[i]div10; c[i]: =c[i]mod10; end; c[0]: =j+1; ifc[c[0]]=0thendec(c[0]); end; (4)高精度-低精度(高精度数大于低精度数且低精度数小于1*109) procedurejian_h_l(a: arr;b: longint;varc: arr);//arr为基类型是longint vari,j: integer; begin ifa[0]>=10then begin dec(a[10]); a[1]: =a[1]+1000000000; endelse begin dec(a[a[0]]); j: =1; fori: =1toa[0]-1doj: =j*10; a[1]: =a[1]+j; end; a[1]: =a[1]-b; fori: =1toa[0]-1do begin a[i+1]: =a[i+1]+a[i]div10;a[i]: =a[i]mod10; end; whilea[a[0]]=0dodec(a[0]); c: =a; end; (5)高精度-高精度 procedurejian_h_h(a,b: arr;varc: arr);//确保a>b vari: integer; begin fori: =a[0]downto2do begin dec(a[i]);a[i-1]: =a[i-1]+10; end; fori: =1toa[0]doc[i]: =a[i]-b[i]; fori: =1toa[0]-1do begin c[i+1]: =c[i+1]+c[i]div10;c[i]: =c[i]mod10; end; c[0]: =a[0]; whilec[c[0]]=0dodec(c[0]);ifc[0]<1thenc[0]: =1; end; (6)高精度*低精度 procedurecheng_h_l(a: arr;b: integer;varc: arr); vari: integer; begin fillchar(c,sizeof(c),0); fori: =1toa[0]doc[i]: =a[i]*b; fori: =1toa[0]+11do begin c[i+1]: =c[i+1]+c[i]div10;c[i]: =c[i]mod10; end; c[0]: =a[0]+11; whilec[c[0]]=0dodec(c[0]); end; (7)高精度*高精度 procedurecheng_h_h(a,b: arr;varc: arr); vari,j: integer; begin fillchar(c,sizeof(c),0); fori: =1toa[0]do forj: =1tob[0]doc[i+j-1]: =c[i+j-1]+a[i]*b[j]; fori: =1toa[0]+b[0]do begin c[i+1]: =c[i+1]+c[i]div10;c[i]: =c[i]mod10; end; c[0]: =a[0]+b[0]; whilec[c[0]]=0dodec(c[0]); End; (8)高精度/低精度 procedurechu_h_l(a: arr;b: integer;varc: arr;vard: integer); vari: integer; begin fillchar(c,sizeof(c),0); d: =0; fori: =a[0]downto1do begin d: =d*10+a[i];c[i]: =ddivb;d: =dmodb; end; c[0]: =a[0]; whilec[c[0]]=0dodec(c[0]);ifc[0]<1thenc[0]: =1; End; (9)高精度/高精度(notok) 用减法代替除法运算: 不断比较A[1..n]与B[1..n]的大小,如果A[1..n]>=B[1..n]则商C[1..n]+1→C[1..n],然后就是一个减法过程: A[1..n]-B[1..n]→A[1..n]。 由于简单的减法速度太慢,故必须进行优化。 设置一个商的位置值J,当A[1..n]>B[1..n]时。 B[1..n]左移→B[0..n],j: =j+1,即令B[1..n]增大10倍。 这样就减少了减法的次数。 当j>0且A[1..n] =j-1,即令B[1..n]缩小10倍。 functiona_dy_b(a,b: arr): boolean; vari: integer; begin i: =a[0]; ifa[0]<>b[0]thena_dy_b: =a[0]>b[0] elsebegin while(a[i]=b[i])and(i>0)dodec(i); a_dy_b: =a[i]>b[i]; end; end; //////////////////////////////////////////////////////////// procedurekuoda(a: arr;varb: arr);//将a扩大10倍 vari: integer; begin fillchar(b,sizeof(b),0); b[0]: =a[0]+1; fori: =1toa[0]dob[i+1]: =a[i]; end; ///////////////////////////////////////////////////////// proceduresuoxiao(a: arr;varb: arr);//将a缩小10倍 vari: integer; begin fillchar(b,sizeof(b),0); fori: =2toa[0]dob[i-1]: =a[i]; b[0]: =a[0]-1; end; ///////////////////////////////////////////////////////// procedurejian_h_h(a,b: arr;varc: arr);//确保a>b vari: integer; begin fori: =a[0]downto2do begin dec(a[i]);a[i-1]: =a[i-1]+10; end; fori: =1toa[0]doc[i]: =a[i]-b[i]; fori: =1toa[0]-1do begin c[i+1]: =c[i+1]+c[i]div10;c[i]: =c[i]mod10; end; c[0]: =a[0]; whilec[c[0]]=0dodec(c[0]);ifc[0]<1thenc[0]: =1; end; ///////////////////////////////////////////////////////// procedurechu_h_h(a,b: arr;varc,d: arr);//主要子程序,a: 被除数, vari,j: integer;//b: 除数;c: 商;d: 余数 begin c[0]: =a[0];d: =b;//复制备份除数 whilea_dy_b(a,d)do//被除数仍然比除数大则循环 begin b: =d;j: =1; whilea_dy_b(a,b)do//扩大除数 begin inc(j);kuoda(b,b); end;//最后一次循环后被除数已比除数小 suoxiao(b,b);dec(j);//将除数缩小10倍以正好能除 whilea_dy_b(a,b)do//求得当前位的商 begin inc(c[j]);jian_h_h(a,b,a); end; end; d: =a;//a中保存的正好是小于除数的余数 whilec[c[0]]=0dodec(c[0]);ifc[0]<1thenc[0]: =1; end; 3、排序: (1)选择排序 procedurexsort(a: arr;varb: arr);//用a[0]保存排序对象的个数 vari,j: integer; begin fori: =1toa[0]-1do forj: =i+1toa[0]do ifa[i]>a[j]thenswap(a[i],a[j]); b: =a; end; (2)冒泡排序 proceduremsort(a: arr;varb: arr); vari,j: integer; begin fori: =1toa[0]-1do forj: =a[0]downtoi+1do
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pascal 常用 子程序
![提示](https://static.bdocx.com/images/bang_tan.gif)