高精度:阶乘之和

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=5×4×3×2×1

输入格式

一个正整数NNN。

输出格式

一个正整数SSS,表示计算结果。

输入输出样例

输入 #1 

3

输出 #1 

9思路:用到了两种高精度,阶乘高精度和加法高精度。高精度阶乘有两种代码:
 1 void JieCheng(int a[], int c)
 2 {
 3     for (int i = 2; i <= c; i++)
 4     {
 5         int jw = 0;
 6         int j = 0;
 7         int temp;
 8
 9         while (j < length)
10         {
11             temp = jw;
12             jw = (a[j] * i + jw) / 10;
13             a[j] = (a[j] * i + temp) % 10;
14             j++;
15         }
16     }
17 }

这种好像不太好理解不太好想,这种需要每求一次阶乘清一次数组,而且时间复杂度也高。

另外一种:

 1 void cheng(int *a,int c)
 2 {
 3     int jw=0;
 4     for(int i=1;i<=1000;i++)
 5     {
 6         a[i]=a[i]*c+jw;
 7         jw=a[i]/10;
 8         a[i]%=10;
 9     }
10 }

这种就不需要清数组,提高了很大效率。

高精度加法代码:

 1 void pplus(int a[], int c[])
 2 {
 3     int jw = 0;
 4
 5     for (int i = 1; i < length; i++)
 6     {
 7         c[i] += a[i] + jw;
 8         jw = c[i] / 10;
 9         c[i] %= 10;
10     }
11 }

最后就判断条件倒序输出即可

 1 #include<iostream>
 2 #include<cstring>
 3
 4 using namespace std;
 5 const int length = 2000;
 6
 7 void JieCheng(int a[], int c)
 8 {
 9     for (int i = 2; i <= c; i++)
10     {
11         int jw = 0;
12         int j = 0;
13         int temp;
14
15         while (j < length)
16         {
17             temp = jw;
18             jw = (a[j] * i + jw) / 10;
19             a[j] = (a[j] * i + temp) % 10;
20             j++;
21         }
22     }
23 }
24
25 void pplus(int a[], int c[])
26 {
27     int jw = 0;
28
29     for (int i = 1; i < length; i++)
30     {
31         c[i] = c[i] + a[i] + jw;
32         jw = c[i] / 10;
33         c[i] %= 10;
34     }
35 }
36
37 int main()
38 {
39     int a[length];
40     int c[length];
41     int n, sum = 0;
42
43     memset(a, 0, sizeof(a));
44     memset(c, 0, sizeof(a));
45     cin >> n;
46     if (n == 0)
47     {
48         cout << "0";
49         return 0;
50     }
51     a[1] = 1;
52     for (int i = 1; i <= n; i++)
53     {
54         JieCheng(a, i);
55         pplus(a, c);
56         memset(a, 0, sizeof(a));
57         a[1] = 1;
58     }
59
60     int flag = 0;
61     for (int i = length-1; i >= 1; i--)
62     {
63         if (c[i] != 0)
64             flag = 1;
65         if (flag)
66             cout << c[i];
67
68     }
69     return 0;
70 }
 

原文地址:https://www.cnblogs.com/ZhengLijie/p/12706671.html

时间: 04-15

高精度:阶乘之和的相关文章

洛谷 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

阶乘之和-----00003

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

中石油-高精度阶乘-java

问题 F: [高精度]高精度阶乘 时间限制: 1 Sec  内存限制: 64 MB提交: 49  解决: 13[提交][状态][讨论版] 题目描述 <魔法宝典>对于修罗王是如此重要,是因为<宝典>里记载了很多匪夷所思的魔法原理.例如很久以前,主流魔法界认为传说中的隐身衣是无法实现的,他们的理论是光线进入人的眼睛才能引起视觉,如果有隐身衣存在,则其中的人由于没有光线进入眼中也就看不见外面的情况.但是后来横空出世的<宝典>里却详细叙述了数种隐身衣的实现原理并成功地将之实现.

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中