蓝桥杯 基础练习——阶乘计算

时间限制:1.0s   内存限制:512.0MB

问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。

算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式
  输入包含一个正整数n,n<=1000。

输出格式
  输出n!的准确值。

样例输入
10

样例输出
3628800

解题报告
乘法的大数计算
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[100010]={1},alen=1;    ///答案
 4 int b[110];
 5 int t[100010],tlen;    ///临时存储 
 6 void multi(int blen) {
 7     for(int i=0;i<alen;i++) {
 8         for(int j=0;j<blen;j++) {
 9             t[i+j]+=(a[i]*b[j]);
10         }
11     }
12     int c=0;    ///进位 
13     alen=alen+blen+1;
14     for(int i=0;i<alen;i++) {
15         t[i]+=c;
16         c=t[i]/10;
17         a[i]=t[i]%10;
18         t[i]=0;
19     }
20     while(!a[alen-1]) {
21         alen--;
22     }
23 }
24 int change(int integer) {
25     int len=0;
26     while(integer) {
27         b[len]=integer%10;
28         integer/=10;
29         len++;
30     }
31     return len;
32 }
33 int main()
34 {
35     int n;
36     cin>>n;
37     for(int i=2;i<=n;i++) {
38         multi(change(i));
39     }
40     for(int i=alen-1;~i;i--) {
41         cout<<a[i];
42     }
43     cout<<endl;
44     return 0;
45 }
View Code

 

posted @ 2020-04-09 22:15  wuliking  阅读(252)  评论(0编辑  收藏  举报