高精度算法.docx

上传人:b****1 文档编号:20148600 上传时间:2023-04-25 格式:DOCX 页数:16 大小:17.83KB
下载 相关 举报
高精度算法.docx_第1页
第1页 / 共16页
高精度算法.docx_第2页
第2页 / 共16页
高精度算法.docx_第3页
第3页 / 共16页
高精度算法.docx_第4页
第4页 / 共16页
高精度算法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

高精度算法.docx

《高精度算法.docx》由会员分享,可在线阅读,更多相关《高精度算法.docx(16页珍藏版)》请在冰豆网上搜索。

高精度算法.docx

高精度算法

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.

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1