阶乘之和

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

时间: 2024-08-08 17:44:49

阶乘之和的相关文章

阶乘之和-----00003

描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No: 输入 第一行有一个整数0<m<100,表示有m组测试数据:每组测试数据有一个正整数n<1000000; 输出 如果符合条件,输出Yes,否则输出No; 样例输入 2 9 10 样例输出 Yes No

nyist 91 阶乘之和

阶乘之和时间限制:3000 ms | 内存限制:65535 KB 难度:3描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No: 输入第一行有一个整数0<m<100,表示有m组测试数据:每组测试数据有一个正整数n<1000000;输出如果符合条件,输出Yes,否则输出No;样例输入2910样例输出YesNo #include <stdio.h>int main( ){ int m

nyoj 91阶乘之和

阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No: 输入 第一行有一个整数0<m<100,表示有m组测试数据:每组测试数据有一个正整数n<1000000; 输出 如果符合条件,输出Yes,否则输出No; 样例输入 2 9 10 样例输出 Yes No #include "stdio.h"

数的阶乘之和

package nothh; public class mmm { public static void main(String[] args) { // TODO Auto-generated method stub //4到1的阶乘之和 int x = 0; int y = 0; int z = 4; while(z>=0) { x = z; for(int j = z - 1; j > 0; j--) { x = j * x; } z--; y = x+y; } System.out.p

C语言之函数调用02—一个三位数的正整数=它的各位数字的阶乘之和

//函数调用+枚举法 /* ========================================================== 题目:求一个三位数的正整数=它的各位数字的阶乘之和! 如:145=1!+4!+5!. ========================================================== */ #include<stdio.h> int J(int n) { int t=1,i; for(i=1;i<=n;i++) t*=i;

阶乘之和 输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤10 6 ,n!表示 前n个正整数之积。

阶乘之和输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0).n≤10 6 ,n!表示前n个正整数之积.样例输入:10样例输出: package demo; import java.util.Scanner; public class demo02 { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); long sum=0; for (int

编写前n项阶乘之和.java

public class C3_17 {      public static void main(String[] args)     {             int n=1,m,s,k=0;             while(n<=8)         {                     for(s=1,m=1;m<n;m++)                 s=s*m;//计算n!,结果存于s中             k=k+s;//计算前n项阶乘之和,结果存于k中  

洛谷——P1009 阶乘之和

P1009 阶乘之和 题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结果. 输入输出样例 输入样例#1: 复制 3 输出样例#1: 复制 9 高精加+高精乘 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #d

洛谷 P1009 阶乘之和

P1009 阶乘之和 题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5*4*3*2*1. 输入输出格式 输入格式: 一个正整数N. 输出格式: 一个正整数S,表示计算结果. 输入输出样例 输入样例#1: 复制 3 输出样例#1: 复制 9思路:高精度加法+高精度乘法. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm

阶乘之和(防止int类型溢出的小技巧&amp;计时函数)

计算前n个正整数阶乘之和的后六位: 注意点是,用一个int类型储存阶乘之和时,要防止溢出 一,在每一次处理阶乘(fa)或者阶乘之和(s)时,都对10^6取余,这样最终结果不变,还避免了越界 二,计时函数可以用来观察程序执行时间 用法: printf("%f",(double)clock()/CLOCKS_PER_SEC); 代码: #include"iostream" #include"ctime" using namespace std; in