nyoj 28-大数次乗(大数テンプレート)

6313 ワード

28-大数乗算
メモリ制限:64 MB時間制限:3000 ms Special Judge:No accepted:19 submit:39
タイトルの説明:
私たちはすべてどのように1つの数の階乗を計算するかを知っていますが、もしこの数が大きいならば、私たちはどのようにそれを計算して出力しますか?
説明を入力:
      m(0 
     

出力の説明:
  m   ,               

サンプル入力:
コピー
50

サンプル出力:
30414093201713378043612608166064768844377641568960512000000000000

ヒント:
ヒントはないよ
 
分析:
大数乗算テンプレートは次のとおりです.
  
 1 for(int i = 1; i <= m; ++ i) //     A           
 2 {
 3     int b = 0; //       
 4     for(int j = 1; j <= len; ++ j)
 5     {
 6         int t = b + i*A[j];
 7         A[j] = t % 10;
 8         b = t / 10;
 9         if(b > 0 && j == len) len ++;
10     }
11 }

 
C/C++コード実装(AC):
 1 #include 
 2 #include 
 3 #include 
 4 #include 
 5 #include 
 6 #include 
 7 #include 
 8 #include 
 9 
10 using namespace std;
11 const int MAXN = 100005;
12 
13 int main()
14 {
15     int m, A[MAXN] = {1, 1}, len = 1;
16     scanf("%d", &m);
17 
18     for(int i = 1; i <= m; ++ i)
19     {
20         int b = 0;
21         for(int j = 1; j <= len; ++ j)
22         {
23             int t = i * A[j] + b;
24             A[j] = t % 10;
25             b = t / 10;
26             if (j == len && b > 0) ++len;
27         }
28     }
29 
30     for(int i = len; i >= 1; -- i)
31         printf("%d", A[i]);
32     printf("
"); 33 return 0; 34 }