回 帖 发 新 帖 刷新版面

主题:[讨论]救急:两道关于高精度运算的题

1.正月里,鼠父鼠母生了12只小鼠,二月里两代鼠全部配对,每对鼠又生了12只;共有98只如此 下去,每月鼠全部配对,每对生12只小鼠,十二个月后鼠的总数是多少?

2.用高精度计算S=1!+2!+3!+……+N!(n小于等于50),
  !为阶乘,输入n,输出结果S。[/size][em18][em18][em18][em18]

回复列表 (共5个回复)

沙发


1、题目可这样考虑:从最初的一对鼠父母开始算起,每过一个月鼠的只数扩大7倍,所以将12个7与2连乘,便可得到答案:是27682574402只。

板凳


   自己写一个可以计算高精度计算的类吧,用运算符重载。

3 楼

高精度算法其实本质上就是模拟,所以你可以把你用笔计算这么个东西的过程转化为计算机语言,应该不算困难。

4 楼

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 楼

第二题:
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

我来回复

您尚未登录,请登录后再回复。点此登录或注册