0058-简单的阶乘
Posted darth-vader-empire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0058-简单的阶乘相关的知识,希望对你有一定的参考价值。
简单的阶乘 |
难度级别:A; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
从键盘上输入一个自然数 n ,输出 n 的阶乘,即 n!。n!=1*2*3*……*n,特殊的,当 n=0 时,n!为 1 。 |
输入
|
一个不超过 12 的自然数 n
|
输出
|
一个正整数,表示 n!的值。
|
输入示例
|
5
|
输出示例
|
120
|
这题是累加的升级版,但注意事项变多了:
1.0的阶乘是1。
2.ans初始值必须给1,不管全局还是局部,全局不赋一,任何数的阶乘都是0。局部不赋1,输出的数吓死你。
代码:
#include<bits/stdc++.h> using namespace std; int i,n,ans=1;//ans别忘了初始值给1,不然任何数的阶乘都是0。 int main() { scanf("%d",&n); for(i=1;i<=n;i++) ans*=i;//累乘。 printf("%d",ans); return 0; }
除以上正解代码外,本题还可以使用平方和公式求解,不知道平方和公式的上网百度。
下面介绍一种令新手们无比佩服的方法:打表(注意不是坐出租车)。
打表,专门针对一些数据范围较小的题。一般使用打表的有以下两种情况:
1.没有思路。
2.自己的方法会超时。
下面讲如何打表。
首先,你需要算出数据范围内每个输入所对应的答案。一般采用手算+计算器。
对于这道题,上网百度12以内阶乘,再用swich打表就行。
代码:
#include<bits/stdc++.h> using namespace std; int n; int main() { scanf("%d",&n); switch(n) { case 1:printf("1");break;//开始打表。 case 2:printf("2");break; case 3:printf("6");break; case 4:printf("24");break; case 5:printf("120");break; case 6:printf("720");break; case 7:printf("5040");break; case 8:printf("40320");break; case 9:printf("362880");break; case 10:printf("3628800");break; case 11:printf("39916800");break; case 12:printf("479001600"); } return 0; }
很神奇是不是?但千万别知道了打表就啥题都打表,看清数据范围!
以上是关于0058-简单的阶乘的主要内容,如果未能解决你的问题,请参考以下文章