基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
输入N求N的阶乘的准确值。
 
Input
输入N(1 <= N <= 10000)
Output
输出N的阶乘
Input示例
5
Output示例
120

思路:按照乘法运算的规则进行模拟,声明一个数组ans,用来存运算后每一位的值。遍历2到n中的所有的数,每次都用这个数去和ans数组中的每个数相乘,并按乘法规则进位即可。

普通版代码:
 //普通版
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<climits>
#include<algorithm>
#include<stack>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
int main()
{
int ans[],n; //ans数组用来储存结果
while(cin>>n)
{
memset(ans,,sizeof(ans));
int cnt = ,res,carry=; //cnt用来记录当前最高位是多少
ans[] = ;
for(int i=; i<=n; ++i) //遍历2-n中所有的数
{
for(int j=; j<cnt; ++j) //ans中的每个数都乘上i
{
res = ans[j]*i+carry; //这一位乘上 i 并加上上一位的进位数量
ans[j] = res%; //按乘法规则进行进位
carry = res/;
}
while(carry) //如果最高为还能进位,最高为就要加 1,一直循环到不能进位为止
{
ans[cnt++] = carry%;
carry /= ;
}
}
for(int i=cnt-; i>=; --i) //输出
printf("%d",ans[i]);
printf("\n");
}
return ;
}
但是,上面的代码还并不足以通过这一题,时间复杂度卡在了时间限制的边缘。我们可以对上面的代码进行一个简单但却精妙的优化。在上面的代码中,ans数组中的每个数仅仅只表示了一位,对于整型变量的范围来说,这显得有些浪费。于是乎,我们可以用ans数组中的每个元素来记录最终答案的多位,这样就可以缩短几倍的时间。
例如,在接下来的代码中,我用ans中的每个数来记录9位,这表示用1000000000代替10来进行进位操作。最后在输出的过程中,如果ans【i】=0,那我们实际上要输出九个0,因为每个位置记录了9位。 优化版代码:
 //优化版:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<climits>
#include<algorithm>
#include<stack>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
const ll MAXN = ; //用来代替10进位的MAXN
using namespace std;
int main()
{
ll ans[]; //用long long防止数据溢出
int n;
while(cin>>n)
{
ans[] = ;
ll res,carry = ,cnt = ;
for(int i=; i<=n; ++i)
{
for(int j=; j<cnt; ++j)
{
res = ans[j]*i + carry;
ans[j] = res % MAXN; //用MAXN进行进位操作
carry = res / MAXN;
}
while(carry)
{
ans[cnt++] = carry;
carry = ;
}
}
printf("%lld",ans[cnt-]); //首先输出最高位的元素,因为最高位的元素并不一定有9位
for(int i=cnt-; i>=; --i) //格式化输出剩下的元素
printf("%.9lld",ans[i]); // %.9的作用是如果数据大于9位,则正常输出,否则,不足9位将在高为上补 0
//如:%.3输出12,将会输出012,所以,上面的ans[i]中若位0,将输出000000000,防止位数丢失
cout<<endl;
}
return ;
}

当然,并不一定要用9位来进行记录,在确保不会导致long long数据溢出的情况下,也可以稍微比9大一些。

如果你选择用15位来记录,运算10000的阶乘时很有可能会溢出,因为15+4=19位,将会超过long long的范围。所以在不太确定的情况下,尽量使用较为保险的长度。

51nod1057—N的阶乘—(大数阶乘)的更多相关文章

  1. nyist28大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们 ...

  2. 大数阶乘(c语言)

    大数阶乘.代码比较简单. #include<stdio.h> #include<string.h> #define MAXN 25000 // 如果你的阶乘N比较大,建议大一点 ...

  3. 【大数阶乘】NYOJ-28

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  4. 大数阶乘 nyoj

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  5. 【ACM】大数阶乘 - Java BigInteger实现

    大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?   输入 输入一个整数 ...

  6. nyoj___大数阶乘

    http://acm.nyist.net/JudgeOnline/problem.php?pid=28 大数阶乘 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 我们都知 ...

  7. 大数阶乘(c++实现)

    #include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...

  8. HDU 1133 Buy the Ticket (数学、大数阶乘)

    Buy the Ticket Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. for循环计算某个数的阶乘、阶乘和及其倒数的阶乘和

    //4的阶乘 int jc = 4; //定义一个变量用来代表要计算的数值 long jd =1; //定义最终输出的阶乘 for(int i = 1; i <= jc;i++) //定义循环加 ...

随机推荐

  1. 简单桶排序算法-python实现

    #-*- coding: UTF-8 -*- import numpy as np def BucketSort(a, n): barrel = np.zeros((1, n), dtype = 'i ...

  2. Guid.NewGuid().ToString()生成唯一码js

    Guid.NewGuid().ToString() 生成唯一码,用户生成随机id 生成唯一编码,版本控制对比等. //表示全局唯一标识符 (GUID). function Guid(g) { var ...

  3. jmeter 目录内容分布

    /bin 目录(常用文件介绍) examples:目录下包含Jmeter使用实例 ApacheJMeter.jar:JMeter源码包 jmeter.bat:windows下启动文件 jmeter.s ...

  4. PAT 甲级 1008 Elevator (20)(20 分)模拟水题

    题目翻译: 1008.电梯 在我们的城市里,最高的建筑物里只有一部电梯.有一份由N个正数组成的请求列表.这些数表示电梯将会以规定的顺序在哪些楼层停下.电梯升高一层需要6秒,下降一层需要4秒.每次停下电 ...

  5. alibaba fastjson的使用总结和心得

      最初接触alibaba fastjson是由于其性能上的优势,对比原来采用codehause.jackson的解析,在hadoop平台上的手动转换对象有着将近1/3的性能提升,但随着开发应用越来越 ...

  6. Keras函数式 API

    用Keras定义网络模型有两种方式, Sequential 顺序模型 Keras 函数式 API模型 之前我们介绍了Sequential顺序模型,今天我们来接触一下 Keras 的函数式API模型. ...

  7. canvas绘制文本

    canvas绘制文本 属性和方法 font = value 设置字体 textAlign = value 设置字体对齐方式 start, end, left, right, center textBa ...

  8. git_基本使用

    1.默认你已经安装了,git的客户端,这里我们使用git bash操作. 2.执行git init命令:     git ini 3.在本地创建ssh key: ssh-keygen -t rsa - ...

  9. Xpath解析xml

    Xpath解析xml其实最主要的是查找xml文档中信息,而且不需要了解xml文档结构 package com.huawei.xml; import java.io.InputStream;import ...

  10. 数据库 alert.log 日志中出现 "[Oracle][ODBC SQL Server Wire Protocol driver][SQL Server] 'RECOVER'"报错信息

    现象描述: (1).数据库通过调用透明网络实现分布式事务,但透明网关停用后,失败的分布式事务并未清理. (2).数据库 alert 日志 Thu Sep 06 06:53:00 2018 Errors ...