タイトル説明
高精度S = 1で計算!2!3!+ ... + nは!"!"(N≤50)は、前記のような要因を表し:5!= 3 * 5 * 4 * 2 * 1。
説明を入力します。
正の整数Nを入力します。
出力説明:
計算結果Sを出力します
例1
エントリー
3
輸出
9
考える:ここでは2つの関数の直接使用は解決するためにシミュレートされた手書きの加算や乗算の自分のコンピューティング大きな数字を書きます。
1の#include <iostreamの>
2の#include <cstdioを>
3の#include <CStringの>
4の#include <cmath>
5の#include <アルゴリズム>
6の#include <地図>
7の#include < 設定 >
8の#include <ベクトル>
9# <キュー>などが
10の#include <リスト>
11の#include <unordered_map>
12を 使用して 名前空間はstdを、
13 の#defineっ長い長い
14 のconst int型 INF = 1E9 + 7 。
;
16
17 // MAXN =のconst int型
18
19インライン列の和(文字列、文字列 B)// 大数加法
20 {
21 ながら(a.size()< b.size())
22 a.insert(0、" 0 " );
23 一方(b.size()< a.size())
24 b.insert(0、" 0 " )。
25 文字列 ANS = "" ;
26 INT= Jinwei 0 、SUM、優;
27 用の(int型 I = a.sizeを() - 1 ; I> = 0 ; i-- )
28 {
29 SUM =([I] - ' 0 ')+(B [ I] - ' 0 ')+ Jinwei;
30 Jinwei = SUM / 10 ;
31である ゆう= SUMの%10 ;
32の ANSは+ =(ゆう+ ' 0 ' );
33である }
34で IF (Jinwei)
35の ANS + =(Jinwei + [0 " );
36 逆(ans.begin()、ans.end())。
37の リターンANS;
38 }
39
40インライン列 MUL(文字列、文字列 B)// 大数乘法
41 {
42 であれば(a.size()< b.size())
43 スワップ(B)
44 ストリング ANS = " 0 " 、RES。
45 文字になりました。
46 のために(int型 I = b.size() - 1 ; I> = 0 ; i--)
47 {
48 のRES = "" ;
49は 今= B [I]を、
50 のint jinwei = 0 、湯、S。
51 のために(INT J = a.size() - 1 ; J> = 0 ; j-- )
52 {
53個の (NOW-のS = ' 0 ')*([J] - ' 0 ')+ jinwei。
54 jinwei =秒/ 10 。
55 湯は、S%= 10 。
56 RES + =(ゆう+ ' 0 ' );
57である }
58 IF (Jinwei)
59の RES + =(Jinweiが+ ' 0 ' );
60
61である リバース(res.begin()、res.end()); // 残りを追加、結果を逆に、必要逆行
62は、
63である ため(INT J = 0 ; J <b.size() - I- 1。 ; J ++)// 高い乗算の終了時に0添加後
64 + = RESを" 0 " 、
65 ANS SUM =(ANS、RES); //は、その後追加
66 }
67の リターンANS;
68 }
69
70 のint main()の
71 {
72の IOS :: sync_with_stdio(偽); cin.tie(0); cout.tie(0 )。
73 INT N。
74 一方(CIN >> N)
75 {
76 列 ANS = " 0 " 。
77 ストリング S = " 1 " 。
78 のために(int型 i = 1 ; iが<= N; iが++)// 阶乘之和
79 {
80 、S = MUL(S、to_stringに(I))。
81の ANS = SUM(ANS、S)。
82 }
83 COUT << ANS << ENDL。
84 }
85 リターン 0 。
86 }