码迷,mamicode.com
首页 > 其他好文 > 详细

阶乘之和

时间:2015-11-02 22:56:24      阅读:322      评论:0      收藏:0      [点我收藏+]

标签:

阶乘之和

【题目描述】用高精度计算出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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!