UVa10323:Factorial! You Must be Kidding!!!
题目大意
给定数字n,计算n!并输出。有两个特例,如果n!超过6227020800则输出Overflow!
,如果n!小于10000则输出Underflow!
。
Solution
6227020800刚好是13!,而10000介于7!和8!之间,所以只要对n做一下比较,分情况输出即可。
Note
这题有个很智障的地方——n可以为负数。所以需要强行拓展关于阶乘的定义。
factorial(n) = n ? factorial(n ? 1)
利用题目中给出的这个公式,factorial(0) = 0 ? factorial(-1)
。
再稍作变形factorial(-1) = factorial(0) / 0
,所以-1的阶乘等于∞。继续按照这个思路扩展,factorial(-1) = -1 ? factorial(-2)
,所以-2的阶乘等于-∞。
以此类推,在n为负数的前提下,n如果是奇数答案就是Overflow!
,如果是偶数答案就是Underflow!
AC-Code(C++)
Time:0ms
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <climits>
#include <ctime>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1000 + 10;
ll fact[20];
int main(int argc, const char * argv[]) {
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
// 13! = 6227020800
// 7! < 10000 < 8!
fact[0] = 1;
for(int i=1;i<=13;i++)
fact[i] = i * fact[i-1];
// what the hell?
// definition for negative number doesn‘t make sense at all.
int n;
while(scanf("%d",&n)==1){
if(n > 13 || (n < 0 && -1*n%2 == 1))
printf("Overflow!\n");
else if(n <= 7 || (n < 0 && -1*n%n == 0))
printf("Underflow!\n");
else
printf("%lld\n",fact[n]);
}
return 0;
}