码迷,mamicode.com
首页 > 其他好文 > 详细

0058-简单的阶乘

时间:2018-08-29 14:38:28      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:its   width   整数   方法   can   mes   键盘   超时   运行时间   

简单的阶乘
难度级别: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-简单的阶乘

标签:its   width   整数   方法   can   mes   键盘   超时   运行时间   

原文地址:https://www.cnblogs.com/DARTH-VADER-EMPIRE/p/9552749.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!