Description
用递归算法,求N!的精确值(N以一般整数输入,N<100)。
输入一个整数n
Output
输出n!
Sample Output
Solution
显然100数据规模的阶乘是无法用longlong存下的,所以我选择用数组来模拟大数乘法,具体代码实现是从社团那里学到的,这里附上我的理解:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <stack> #include <queue> #include <map>
#define MAX 10001 #define ll long long int #define scf(a) scanf("%d", &a) #define mms(a) memset(a, 0, sizeof(a))
using namespace std;
int num[100], endn = 0;
void Bignum(int n) { if (n == 1) return;
int temp = 0; for (int i = 0; i <= endn; i++) { num[i] = num[i] * n + temp; temp = num[i] / 10; num[i] %= 10; } while (temp) { num[++endn] = temp % 10; temp /= 10; }
Bignum(n - 1); }
int main() { int n; while (cin >> n) { mms(num); num[0] = 1; Bignum(n);
printf("%d!=", n); for (int i = endn; i >= 0; i--) cout << num[i]; cout << endl; } }
|
一开始发现long long不够用的时候,我第一反应也是用数组来模拟乘法,但是当时脑子里一直想的都是列竖式计算的时候的进位方法,也就是一位一位的去跟所有数乘,然后每次只会进一位。
在看了社团那边的代码之后才恍然大悟,可以每次直接用n去和数组的每一位数字相乘,多出来的数全部进位就好,不用顾忌“进位的数有好几位怎么办”这样愚蠢的问题。