高精度算法.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((a1begin
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.