【问题描述】
已知正整数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.