主题:[讨论]救急:两道关于高精度运算的题
979992526
[专家分:0] 发布于 2008-07-09 09:54:00
1.正月里,鼠父鼠母生了12只小鼠,二月里两代鼠全部配对,每对鼠又生了12只;共有98只如此 下去,每月鼠全部配对,每对生12只小鼠,十二个月后鼠的总数是多少?
2.用高精度计算S=1!+2!+3!+……+N!(n小于等于50),
!为阶乘,输入n,输出结果S。[/size][em18][em18][em18][em18]
回复列表 (共5个回复)
沙发
yjxyangjiaxin [专家分:50] 发布于 2008-07-16 16:54:00
1、题目可这样考虑:从最初的一对鼠父母开始算起,每过一个月鼠的只数扩大7倍,所以将12个7与2连乘,便可得到答案:是27682574402只。
板凳
myfly0402 [专家分:80] 发布于 2008-07-21 14:00:00
自己写一个可以计算高精度计算的类吧,用运算符重载。
3 楼
davidw017 [专家分:4170] 发布于 2008-08-04 02:47:00
高精度算法其实本质上就是模拟,所以你可以把你用笔计算这么个东西的过程转化为计算机语言,应该不算困难。
4 楼
wangzhongqi [专家分:0] 发布于 2008-09-20 17:58:00
2题
var
i,j,s,n:integer;
begin
read(n);
for i:=2 to n do
begin
for j:=1 to i do
s:=s+s*j;
end;
writeln('n de jie cheng wei',s);
end.
5 楼
xjwxwy [专家分:0] 发布于 2008-10-04 18:13:00
第二题:
program m1;
{$N+}
const
Max=65;
type
AByte=array[0..0]of byte;
PBYte=^AByte;
function GetZero(len:byte):PByte;
var
p:PByte;
i:byte;
begin
GetMem(p,SizeOf(AByte)*(len+1));
p^[0]:=len;
for i:=1 to len do p^[i]:=0;
GetZero:=p;
end;
procedure Free(var p:PByte);
begin
FreeMem(p,SizeOf(AByte)*(p^[0]+1));
p:=nil;
end;
function Len(p:PByte):byte;assembler;
asm
les di,[bp+4]
mov al,es:[di]
end;
function Add(var p:PByte;q:PByte):boolean;
var
i,j,tmp:byte;
carry:boolean;
begin
carry:=false;
for i:=1 to p^[0] do
begin
tmp:=p^[i]+q^[i];
if carry then
begin
inc(tmp);
carry:=false;
end;
if tmp>9 then
begin
p^[i]:=tmp-10;
carry:=true;
end else p^[i]:=tmp;
end;
Add:=not Carry;
end;
function Mul(p:PByte;n:word):boolean;
var
i,j:word;
carry:longint;
tmp:PByte;
flag:boolean;
begin
tmp:=GetZero(Len(p)+7);
carry:=0;
for i:=1 to p^[0] do
begin
if p^[0]>0 then
begin
carry:=n*p^[i];
j:=i;
while carry>0 do
begin
inc(tmp^[j],carry mod 10);
carry:=carry div 10;
inc(j);
end;
for j:=i to i+7 do
begin
tmp^[j+1]:=tmp^[j+1]+tmp^[j] div 10;
tmp^[j]:=tmp^[j] mod 10;
end;
end;
end;
for i:=1 to p^[0] do
p^[i]:=tmp^[i];
flag:=true;
for i:=p^[0]+1 to p^[0]+7 do
if tmp^[i]>0 then
begin
flag:=false;
break;
end;
Free(tmp);
Mul:=flag;
end;
procedure Insert(p:PByte;m:byte;n:byte);assembler;
asm
les di,[bp+8]
add di,[bp+6]
mov al,[bp+4]
mov es:[di],al
end;
procedure Print(p:PByte);assembler;
asm
les di,[bp+4]
mov cl,es:[di]
xor ch,ch
add di,cx
mov ah,02h
@@1: mov dl,es:[di]
or dl,030h
int 21h
@@2: dec di
loop @@1
mov dl,0ah
int 21h
mov dl,0dh
int 21h
end;
var
a,b:double;
p,q:PByte;
i:word;
tf:text;
begin
assign(tf,'z.txt');
ReWrite(tf);
a:=1.0;
b:=0.0;
for i:=1 to 50 do
begin
a:=a*i;
b:=b+a;
end;
writeln(b);
writeln(tf,b);
p:=GetZero(max);
q:=GetZero(max);
Insert(p,1,1);
for i:=1 to 50 do
begin
mul(p,i);
add(q,p);
end;
print(q);
for i:=q^[0] downto 1 do
write(tf,q^[i]);
writeln(tf);
close(tf);
end.
打印在z.txt中的两个答案为
3.10350532295462E+0064
31035053229546199656252032972759319953190362094566672920420940313
我来回复