nyoj 28 nyoj 69-大数阶乘
2011-12-11 21:49
211 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数水题~~
这是具体计算阶乘的~
如果只需要计算大数阶乘的位数,像http://acm.nyist.net/JudgeOnline/problem.php?pid=69,有公式可以套~~~ n!的位数 = log10(2*PI*n)/2+n*log10(n/e);
代码如下:
#include<stdio.h> int a[20000]; void ch(int *a, int n) { int i, k; for(i = 19999; i >= 0; i--) { if(a[i]) break; } k = i; for(i = 0; i <= k; i++) { a[i] = a[i] * n; } for(i = 0; i < 20000; i++) { if(a[i] > 9) { a[i+1] += a[i] / 10; a[i] = a[i] % 10; } } } int main() { int n, i; a[0] = 1; scanf("%d", &n); for(i = 1; i <= n; i++) ch(a, i); for(i = 19999; i >= 0; i--) { if(a[i]) break; } for(; i >= 0; i--) printf("%d", a[i]); putchar(10); return 0; }
这是具体计算阶乘的~
如果只需要计算大数阶乘的位数,像http://acm.nyist.net/JudgeOnline/problem.php?pid=69,有公式可以套~~~ n!的位数 = log10(2*PI*n)/2+n*log10(n/e);
代码如下:
#include<iostream> #include<math.h> using namespace std; int main() { int tcases, n; cin >> tcases; while(tcases--) { cin >> n; if(n == 1) cout << 1 << endl; else { int result = (int) (log10(4.0 * acos(0.0) * n)/2 + 1.0 * n * log10(1.0 *n / exp(1.0))) + 1; //arccos(0)= PI/2 cout << result << endl; } } return 0; }