阶乘和

来源:互联网 发布:java 多线程同步机制 编辑:程序博客网 时间:2024/04/28 15:01
【问题描述】
        已知正整数N(N<=100),设S=1!+2!+3!+...N!。其中"!"表示阶乘,即N!=1*2*3*……*(N-1)*N,如:3!=1*2*3=6。请编程实现:输入正整数N,输出计算结果S的值。
【输入样例】sum.in
4
【输出样例】sum.out
33
       分析:此题是一个基础的高精度的运算,但是如果只是简单的用十进制运算的话,当n值过大超过33时结果就会出现异常,出现异常的原因是在做乘法过程中中间变量的值x会超过整数类型范围,所以如果n<100的话应该用100进制,如果求n的阶乘的话应该使用n进制。
pascal代码:
type
  sz=array[0..500] of longint;
var
  n,la,lb,len,i:integer;
  a,b,total:sz;
procedure init;
begin
  readln(n);
  fillchar(a,sizeof(a),0);
  fillchar(b,sizeof(b),0);
  fillchar(total,sizeof(total),0);
  a[1]:=1;
  la:=1;
  len:=1;
end;
procedure multi(var a:sz;n:integer);
var
  i,x:longint;
begin
  x:=0;
  for i:=1 to la do
    begin
      x:=x+a[i]*n;
      a[i]:=x mod 100;
      x:=x div 100;
      {writeln(x);}
    end;
  if x>0 then
    begin
      inc(la);
      a[la]:=x;
    end;
  while (a[la]=0) and (la>1) do dec(la);
end;
procedure plus(var total:sz;a:sz);
var
  i,x:longint;
begin
  x:=0;
  i:=1;
  while (i<=la) or (i<=len) do
    begin
      x:=x+total[i]+a[i];
      total[i]:=x mod 100;
      x:=x div 100;
      inc(i);
    end;
  len:=i;
  total[len]:=x;
  while (total[len]=0) and (len>1) do dec(len);
end;
begin
  assign(input,'sum.in');
  assign(output,'sum.out');
  reset(input);
  rewrite(output);
  init;
  for i:=1 to n do
    begin
      multi(a,i);
      plus(total,a);
    end;
  write(total[len]);
  for i:=len-1 downto 1 do write(total[i] div 10,total[i] mod 10);
  close(input);
  close(output);
end.
原创粉丝点击