高精度算法.docx
- 文档编号:20148600
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:16
- 大小:17.83KB
高精度算法.docx
《高精度算法.docx》由会员分享,可在线阅读,更多相关《高精度算法.docx(16页珍藏版)》请在冰豆网上搜索。
高精度算法
1、高精度加法
var
a,b,c:
array[0..1000]oflongint;
k,len1,len2:
longint;
procedureinit;
var
s1,s2:
string;
i:
integer;
begin
readln(s1);
readln(s2);
len1:
=length(s1);
len2:
=length(s2);
k:
=len1+len2;
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
fillchar(c,sizeof(c),0);
fori:
=1tolen1doa[i]:
=ord(s1[len1-i+1])-48;
fori:
=1tolen2dob[i]:
=ord(s2[len2-i+1])-48;
end;
proceduremain;
vars,g,i:
integer;
begin
g:
=0;
fori:
=1tolen1+len2do
begin
s:
=a[i]+b[i]+g;
c[i]:
=smod10;
g:
=sdiv10;
end;
end;
procedureprint;
vari:
integer;
begin
whilec[k]=0dodec(k);
fori:
=kdownto1dowrite(c[i]);
end;
begin
init;
main;
print;
writeln;
end.
2、高精度减法
var
a1,b1,t:
string;
la,lb,i,max:
longint;
f:
boolean;
a,b:
array[1..1000]ofinteger;
begin
readln(a1);
readln(b1);
f:
=true;
if((a1 begin t: =a1;a1: =b1;b1: =t;f: =false; end; la: =length(a1); lb: =length(b1); ifla>lbthenmax: =laelsemax: =lb; fori: =ladownto1doa[la-i+1]: =ord(a1[i])-48; fori: =lbdownto1dob[lb-i+1]: =ord(b1[i])-48; fori: =1tomaxdo begin a[i]: =a[i]-b[i]; ifa[i]<0then begin a[i]: =a[i]+10; a[i+1]: =a[i+1]-1; end; end; while(a[max]=0)and(max>1)domax: =max-1; iff=falsethenwrite('-'); fori: =maxdownto1dowrite(a[i]); writeln; end. 3、高精度乘法1 var a,c: array[0..1000]oflongint; k,len1,len2,b: longint; procedureinit; var s1,s2: string; i: integer; begin readln(s1); readln(b); len1: =length(s1); k: =len1+2; fillchar(a,sizeof(a),0); fillchar(c,sizeof(c),0); fori: =1tolen1doa[i]: =ord(s1[len1-i+1])-48; end; proceduremain; vars,g,i: integer; begin g: =0; fori: =1tolen1+2do begin s: =a[i]*b+g; c[i]: =smod10; g: =sdiv10; end; end; procedureprint; vari: integer; begin whilec[k]=0dodec(k); fori: =kdownto1dowrite(c[i]); end; begin init; main; print; writeln; end. 4、高精度乘法2 vara,b: array[1..1000]ofinteger; c: array[1..2000]ofinteger; s1,s2: string; k1,k2,i,j,e,x,y,z,w,t: integer; begin readln(s1); readln(s2); k1: =length(s1); k2: =length(s2); fori: =1tok1doa[i]: =ord(s1[k1-i+1])-48; fori: =1tok2dob[i]: =ord(s2[k2-i+1])-48; fori: =1tok1do forj: =1tok2do begin x: =a[i]*b[j]; y: =xdiv10; z: =xmod10; w: =i+j-1; c[w]: =c[w]+z; c[w+1]: =c[w+1]+c[w]div10+y; c[w]: =c[w]mod10 end; e: =k1+k2; fori: =edownto1do ifc[i]<>0then begin t: =i; break; end; forj: =tdownto1dowrite(c[j]); writeln; end. 5、高精度除法 typegj=array[0..240]ofinteger; vara,b,c: gj; s: string; i: integer; functionmoeq(s: integer): boolean; vari: integer; begin ifa[0]-s+1>b[0]thenexit(true) elseifa[0]-s+1 fori: =0tob[0]-1do ifa[a[0]-i]>b[b[0]-i]thenexit(true) elseifa[a[0]-i] moeq: =true; end; procedureminus(s: integer); vari,j: integer; begin j: =1; fori: =stos+b[0]-1do begin ifa[i] elsedec(a[i],b[j]); inc(j); end; while(a[0]>0)and(a[a[0]]=0)dodec(a[0]); ifa[0]=0thena[0]: =1; end; procedureprint(x: gj); begin fori: =x[0]downto1dowrite(x[i]); writeln; end; begin readln(s); a[0]: =length(s); fori: =1toa[0]do a[i]: =ord(s[a[0]-i+1])-48; readln(s); b[0]: =length(s); fori: =1tob[0]do b[i]: =ord(s[b[0]-i+1])-48; c[0]: =a[0]-b[0]+1; fori: =c[0]downto1do begin whilemoeq(i)do begin minus(i); inc(c[i]); end; end; while(c[0]>0)and(c[c[0]]=0)dodec(c[0]); ifc[0]=0thenc[0]: =1; print(c); print(a); end. 6、保留100位有效数字 【题目描述】 输入任意两个整数a,b(a,b均在长整型范围内),计算a/b的结果,保留100位有效数字,最后一位要求四舍五入。 【输入格式】 两个数a,b 【输出格式】 a/b的商,保留100位有效数字 【输入样例】 12913 【输出样例】 9.923076923076923076923076923076923076923076923076923076923076923076923076923076923076923076923076923 参考程序: Programyxsz; var x: array[1..101]oflongint; a,b,c,r,l,i: longint; begin assign(input,'xiao.in');reset(input); assign(output,'xiao.out');rewrite(output); readln(input,a,b); c: =adivb; write(output,c,'.'); l: =0; whilec<>0do begininc(l);c: =cdiv10;end; r: =amodb; fori: =1to101-ldo begin r: =r*10; x[i]: =rdivb; r: =rmodb; end; ifx[101-l]>=5theninc(x[100-l]); i: =100-l; whilex[i]=10do begin inc(x[i-1]); x[i]: =0; dec(i); end; fori: =1to100-ldo write(output,x[i]); close(input); close(output); end. 7、用高精度计算出s=1! +2! +3! +...+100! programjiecheng; programjiecheng; type numtype=array[1..255]oflongint; var s,t: numtype; ls,lt,i: longint; procedureplus(vara: numtype;varla: longint;b: numtype;lb: longint); var i,x: byte; begin ifla>=lb thenx: =la elsex: =lb; fori: =1toxdo begin a[i]: =a[i]+b[i]; a[i+1]: =a[i+1]+a[i]div10; a[i]: =a[i]mod10; end; whilea[x+1]<>0do x: =x+1; la: =x; end; proceduremultiply(vara: numtype;varla: longint;c: longint); var i: longint; begin a[1]: =a[1]*c; fori: =2tolado begin a[i]: =a[i]*c; a[i]: =a[i]+a[i-1]div10; a[i-1]: =a[i-1]mod10; end; whilea[la]>=10do begin inc(la); a[la]: =a[la-1]div10; a[la-1]: =a[la-1]mod10; end; end; begin lt: =1; t[1]: =1; ls: =0; fori: =1to100do begin multiply(t,lt,i); plus(s,ls,t,lt); end; write(s[ls]); fori: =ls-1downto1do write(s[i]); writeln; end. 8、麦森数 形如2^P-1的素数称为麦森数,这时P一定也是个素数。 但反过来不一定,即如果P是个素数,2^P-1不一定也是素数。 到1998年底,人们已找到了37个麦森数。 最大的一个是P=3021377,它有909526位。 麦森数有许多重要应用,它与完全数密切相关。 任务: 从文件中输入P(1000 输入格式InputFormat 文件中只包含一个整数P(1000 输出格式OutputFormat 第一行: 十进制高精度数2^P-1的位数。 第2-11行: 十进制高精度数2^P-1的最后500位数字。 (每行输出50位,共输出10行,不足500位时高位补0) 不必验证2^P-1与P是否为素数。 样例输入SampleInput 1279 样例输出SampleOutput 386 00000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000 00000000000000104079321946643990819252403273640855 38615262247266704805319112350403608059673360298012 23944173232418484242161395428100779138356624832346 49081399066056773207629241295093892203457731833496 61583550472959420547689811211693677147548478866962 50138443826029173234888531116082853841658502825560 46662248318909188018470682222031405210266984354887 32958028878050869736186900714720710555703168729087 var n: longint; i,j: longint; out: array[1..500]oflongint; sta: array[1..1000]oflongint; proceduresolve(n: longint); begin ifn=0then exit; solve(ndiv2); fori: =1to500do forj: =1to500do ifnmod2=0 then sta[i+j-1]: =sta[i+j-1]+out[i]*out[j] else sta[i+j-1]: =sta[i+j-1]+out[i]*out[j]*2; fori: =1to500do begin out[i]: =sta[i]mod10; sta[i+1]: =sta[i+1]+sta[i]div10; end; fori: =1to1000dosta[i]: =0 end; begin readln(n); writeln(trunc(ln (2)/ln(10)*n)+1); out[1]: =1; solve(n); fori: =500downto2do begin write(out[i]); ifimod50=1thenwriteln end; writeln(out[1]-1); end. 9、过去的姫君 题目背景 忠诚的骑士Rai为他心爱的公主Hon设计钻石组坠.他正在考虑如何切割能够使钻石最光彩夺目.他手中有K颗小钻石,他知道应该切出N个顶点.传说如果每颗钻石上的三角形总数加起来最少时,能够达到最好效果. 题目描述 为了更好的研究问题.Rai在平面上画了N个点,任意三点不共线.他要把这N个点分成K组,每组至少三个点.在分完组后Rai把同组的任意两点之间都连一条边(即所有点对之间都存在一条边),不同组点不连边.那么,形成的图形中,总共最少有多少个由连边作为三角形边的三角形? 输入 只有一行,N和K,用空格隔开. 输出 最少的三角形数. 输入样例 92 输出样例 14 数据规模 对于100%数据,3*K<=N<=maxlongint. 样例解释 分成两组,一组4,一组5.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高精度 算法