标签:
阶乘之和
【题目描述】用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
【输入格式】一个正整数N。
【输出格式】一个正整数S,表示计算结果。
思路:高精乘加高精加
program aa; var n,l,ls,i:longint; a:array[1..1000]of longint; s:array[1..1000]of longint;//s数组里是下一个要加的数,是变化的。 procedure jc(i:longint);//这个过程是用来求s数组的 var j:longint; begin if i=1 then begin l:=1; ls:=1; s[ls]:=1; exit; end; if i>1 then begin for j:=1 to ls do s[j]:=s[j]*i;//想想为毛这么做 for j:=1 to ls do if s[j]>=10 then begin inc(s[j+1],s[j] div 10); s[j]:=s[j] mod 10; end; if s[ls+1]<>0 then inc(ls); while s[ls]>=10 do begin inc(ls); inc(s[ls],s[ls-1] div 10); s[ls-1]:=s[ls-1] mod 10; end; if ls>=l then l:=ls; end; end; procedure work; var i,j,k:longint; begin for i:=1 to n do//当前要加的数为i的阶乘。 begin jc(i); for j:=1 to l do inc(a[j],s[j]);//将阶乘加在a上面的几步 for j:=1 to l do if a[j]>=10 then begin inc(a[j+1],a[j] div 10); a[j]:=a[j] mod 10; end; if a[l+1]<>0 then inc(l); while a[l]>=10 do begin inc(l); inc(a[l],a[l-1] div 10); a[l-1]:=a[l-1] mod 10; end; end; end; begin readln(n); work; for i:=l downto 1 do write(a[i]); end.
一点反思:开始时215了,因为红字部分出错,写成a数组了……
标签:
原文地址:http://www.cnblogs.com/liuxinyu/p/4931346.html