高精度程序.docx
- 文档编号:11426327
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:20
- 大小:16.76KB
高精度程序.docx
《高精度程序.docx》由会员分享,可在线阅读,更多相关《高精度程序.docx(20页珍藏版)》请在冰豆网上搜索。
高精度程序
1、高精度加法
高精度加法程序如下:
programHighPrecision1_Plus;
const
fn_inp='hp1.inp';
fn_out='hp1.out';
maxlen=100;{数的最大长度}
type
hp=record
len:
integer;{数的长度}
s:
array[1..maxlen]ofinteger
{s[1]为最低位,s[len]为最高位}
end;
var
x:
array[1..2]ofhp;
y:
hp;{x:
输入;y:
输出}
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{将字符串转换到HP}
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{从a,b中取较大长度}
elselen:
=b.len;
fori:
=1tolendo{从低到高相加}
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]);{加1到高位}
end;
end;
ifc.s[len+1]>0theninc(len);
c.len:
=len;
end;
procedureout;{打印输出}
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
close(output);
end;
begin
init;
Plus(x[1],x[2],y);
out;
end.
2、高精度减法
高精度减法程序如下:
programHighPrecision2_Subtract;
const
fn_inp='hp2.inp';
fn_out='hp2.out';
maxlen=100;{数的最大长度}
type
hp=record
len:
integer;{数的长度}
s:
array[1..maxlen]ofinteger
{s[1]为最低位,s[len]为最高位}
end;
var
x:
array[1..2]ofhp;
y:
hp;{x:
输入;y:
输出}
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.
3、高精度乘法
1).高精度乘单精度(1位数)
程序如下:
programHighPrecision3_Multiply1;
const
fn_inp='hp3.inp';
fn_out='hp3.out';
maxlen=100;{数的最大长度}
type
hp=record
len:
integer;{数的长度}
s:
array[1..maxlen]ofinteger
{s[1]为最低位,s[len]为最高位}
end;
var
x:
array[1..2]ofhp;
y:
hp;{x:
输入;y:
输出}
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);
len:
=a.len;
fori:
=1tolendo
begin
inc(c.s[i],a.s[i]*b);
inc(c.s[i+1],c.s[i]div10);
c.s[i]:
=c.s[i]mod10;
end;
inc(len);
while(c.s[len]>=10)do
begin
inc(c.s[len+1],c.s[len]div10);
c.s[len]=c.s[len]mod10;
inc(len);
end;
while(len>1)and(c.s[len]=0)dodec(len);
c.len:
=len;
end;
proceduremain;
begin
Multiply(x,z,y);
end;
procedureout;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
close(output);
end;
begin
init;
main;
out;
end.
2).高精度乘一个整型数据(integer)
只需要将上述程序的hp类型定义如下即可:
type
hp=record
len:
integer{lengthofthenumber}
s:
array[1..maxlen]oflongint
{s[1]isthelowestposition
s[len]isthehighestposition}
end;
3).高精度乘高精度
程序如下:
programHighPrecision4_Multiply2;
const
fn_inp='hp4.inp';
fn_out='hp4.out';
maxlen=100;{maxlengthofthenumber}
type
hp=record
len:
integer;{lengthofthenumber}
s:
array[1..maxlen]ofinteger
{s[1]isthelowestposition
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;
procedureMultiply(a,b:
hp;varc:
hp);{c:
=a+b}
vari,j,len:
integer;
begin
fillchar(c,sizeof(c),0);
fori:
=1toa.lendo
forj:
=1tob.lendo
begin
inc(c.s[i+j-1],a.s[i]*b.s[j]);
inc(c.s[i+j],c.s[i+j-1]div10);
c.s[i+j-1]:
=c.s[i+j-1]mod10;
end;
len:
=a.len+b.len+1;
{
theproductofanumberwithidigitsandanumberwithjdigits
canonlyhaveatmosti+j+1digits
}
while(len>1)and(c.s[len]=0)dodec(len);
c.len:
=len;
end;
proceduremain;
begin
Multiply(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.
4、高精度除法
1).高精度除以整型数据(integer);
程序如下:
programHighPrecision3_Multiply1;
const
fn_inp='hp5.inp';
fn_out='hp5.out';
maxlen=100;{maxlengthofthenumber}
type
hp=record
len:
integer;{lengthofthenumber}
s:
array[1..maxlen]ofinteger
{s[1]isthelowestposition
s[len]isthehighestposition}
end;
var
x,y:
hp;
z,w:
integer;
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;
procedureDivide(a:
hp;b:
integer;varc:
hp;vard:
integer);
{c:
=adivb;d:
=amodb}
vari,len:
integer;
begin
fillchar(c,sizeof(c),0);
len:
=a.len;
d:
=0;
fori:
=lendownto1do{fromhightolow}
begin
d:
=d*10+a.s[i];
c.s[i]:
=ddivb;
d:
=dmodb;
end;
while(len>1)and(c.s[len]=0)dodec(len);
c.len:
=len;
end;
proceduremain;
begin
Divide(x,z,y,w);
end;
procedureout;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
writeln(w);
close(output);
end;
begin
init;
main;
out;
end.
2).高精度除以高精度
程序如下:
programHighPrecision4_Multiply2;
const
fn_inp='hp6.inp';
fn_out='hp6.out';
maxlen=100;{maxlengthofthenumber}
type
hp=record
len:
integer;{lengthofthenumber}
s:
array[1..maxlen]ofinteger
{s[1]isthelowestposition
s[len]isthehighestposition}
end;
var
x:
array[1..2]ofhp;
y,w:
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;
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;
procedureMultiply10(vara:
hp);{a:
=a*10}
vari:
Integer;
begin
fori:
=a.lendownto1do
a.s[i+1]:
=a.s[i];
a.s[1]:
=0;
inc(a.len);
while(a.len>1)and(a.s[a.len]=0)dodec(a.len);
end;
procedureDivide(a,b:
hp;varc,d:
hp);{c:
=adivb;d:
=amodb}
vari,j,len:
integer;
begin
fillchar(c,sizeof(c),0);
len:
=a.len;
fillchar(d,sizeof(d),0);
d.len:
=1;
fori:
=lendownto1do
begin
Multiply10(d);
d.s[1]:
=a.s[i];{d:
=d*10+a.s[i]}
{c.s[i]:
=ddivb;d:
=dmodb;}
{while(d>=b)dobegind:
=d-b;inc(c.s[i])end}
while(compare(d,b)>=0)do
begin
Subtract(d,b,d);
inc(c.s[i]);
end;
end;
while(len>1)and(c.s[len]=0)dodec(len);
c.len:
=len;
end;
proceduremain;
begin
Divide(x[1],x[2],y,w);
end;
procedureout;
begin
assign(output,fn_out);
rewrite(output);
PrintHP(y);
writeln;
PrintHP(w);
writeln;
close(output);
end;
begin
init;
main;
out;
end.
练习:
求n!
(n<10000)的最后一位不为0的数字.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高精度 程序