博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa10323:Factorial! You Must be Kidding!!!
阅读量:4498 次
发布时间:2019-06-08

本文共 1381 字,大约阅读时间需要 4 分钟。

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 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;}

转载于:https://www.cnblogs.com/irran/p/UVa10323.html

你可能感兴趣的文章
Mysql安装后的一些设置
查看>>
4、Qt Project之串口数据传输
查看>>
Python List reverse()方法
查看>>
Jmeter 正则提取器
查看>>
lua -- 生成协议
查看>>
HLP帮助文件源文件RTF文件的编写
查看>>
2.30模型字符串拷贝
查看>>
XPATH怎么获取TITLE中有中文的标签
查看>>
Tomcat中server.xml参数说明
查看>>
Wget下载终极用法和15个详细的例子
查看>>
JavaScript16进制颜色值和rgb的转换
查看>>
Laravel 输出Hellow World!
查看>>
【bzoj 十连测】[noip2016十连测第九场]Problem B: 小P的单调区间(最长上升子序列+树状数组)...
查看>>
linux--samba
查看>>
django基础之中介模型
查看>>
关于副本机制
查看>>
Oracle之存储过程
查看>>
解决电脑复选框图标不正确方法
查看>>
伪数组怎么转为真正的数组呢~
查看>>
WebGL笔记(六):简单灯光
查看>>