题目:http://acm.hdu.edu.cn/showproblem.php?pid=1042

题目说明待求阶乘的数最大为10000,而10000!的位数为35660(这个数是上网查的),所以已经有的数据类型无法表示.

思路:用int型数组存储n!的每一步计算结果,并且数组大小应该不小于35660这个数.每一步计算,手动模拟乘法的过程.

首先看看乘法的过程.例如,1234 x 67,手动计算,有两种方法.

方法一:先用7乘以1234,再用60乘以1234,然后再将两个结果相加.

方法二:先后用67乘以4、3、2、1.

方法二更容易用代码实现.具体看看方法二的过程,如下图(运算过程在右边)

上述过程可以概括为:先乘当前位,再加上进位数,取余替换前位的值,取商作为新的进位数.

C++代码如下:

#include<iostream>
using namespace std; int main()
{
int n;
const int maxn = 35660 + 1;//10000!的阶乘一共有35660位
while(cin>>n)
{
int a[maxn];
memset(a,0,sizeof(a));
a[maxn-1] = 1;//按照从左到右的习惯,记录结果 int i,j;
for(i=2;i<=n;i++)//具体计算过程
{
int c = 0;
for(j=maxn-1;j>=0;j--)//用i乘以[1*2*...*(i-1)]的值
{
int x = a[j]*i + c;//[这三行是乘法的核心代码,和加法类似]
a[j] = x % 10;
c = x / 10;
}
} for(i=0;i<maxn;i++)//规范输出,找到第一个非零的数的下标
if(a[i])
break; //cout << "10000!一共有" << maxn-i << "位" << endl; for(j=i;j<maxn;j++)//从非零的那一位(第i位)开始输出
cout << a[j];
cout << endl;
} return 0;
}

上述代码,提交可以通过.

小结:

maxn (= 35660 + 1)这个数的设置会影响判题.

开始设为1000,10000,对于较小的数的阶乘可以正确计算,但是无法记录10000!的结果,所以显示PE.

后来改为20000显示PE.

再改为40000显示超时,再上网查了一下10000的阶乘有35660位.

做完题目之后,有测了一下,maxn=37000也会超时.

所以,maxn可以设置为35660 ~ 36000(区间可以更精确一点)的一个数.

【hdoj_1042】N!(大数)的更多相关文章

  1. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  2. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  3. c语言经典算法——查找一个整数数组中第二大数

    题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...

  4. 杨氏矩阵:查找x是否在矩阵中,第K大数

    参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...

  5. 蓝桥杯算法提高 P1001(大数乘法)

      算法提高 P1001   时间限制:1.0s   内存限制:256.0MB   当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...

  6. 51nod 1005 大数加法

    #include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...

  7. PHP大数(浮点数)取余

    一般我们进行取余运算第一个想到的就是用百分号%,但当除数是个很大的数值,超出了int范围时,这样取余就不准确了. php大数(浮点数)取余函数 /** * php大数取余 * * @param int ...

  8. HDU 5686 斐波那契数列、Java求大数

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...

  9. 区间K 大数查询

      算法训练 区间k大数查询   时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...

随机推荐

  1. 【Python3的进制扫盲】

    一.进制 1.进制简介 进制就是进位制,是人们规定的一种进位方法.计算机底层的数据运算和存储都是二进制数据.计算机语言就是二进制,计算机能直接识别二进制数据,其它数据都不能直接识别. 2.常用进制 对 ...

  2. bzoj2621: [Usaco2012 Mar]Cows in a Skyscraper(状压DP)

    第一眼是3^n*n的做法...然而并不可行T T 后来发现对于奶牛的一个状态i,最优情况下剩下那个可以装奶牛的电梯剩下的可用重量是一定的,于是我们设f[i]表示奶牛状态为i的最小电梯数,g[i]为奶牛 ...

  3. python基础----多态与多态性、super函数用法、继承原理

    一.多态与多态性                                                                        ㈠多态: 多态指的是一类事物有多种形态, ...

  4. Java高级应用之泛型与反射20170627

    /*************************************************************************************************** ...

  5. 驱动之DMA的介绍与应用20170210

    本文主要介绍的是DMA相关的知识,首先: 1)在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题.即DMA传输前,CPU要把 总线控制权交给DMA控制器,而在结束DM ...

  6. HDU--2962

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 分析:最短路+二分. #include<iostream> #include< ...

  7. bnuoj53075 外挂使用拒绝

    题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=53075 第一次给校赛出题,来为自己的题目写一发题解吧. 其实我原本的题意非常简洁: 结果被另一位 ...

  8. 「Python」人脸识别应用

    人脸识别主要步骤: face_recognition 库的安装 安装此库,首先需要安装编译dlib,此处我们偷个懒,安装软件Anaconda(大牛绕过),此软件预装了dlib. 安装好后,我们直接通过 ...

  9. Intellj IDEA使用技巧记录

    ▲.Intellj IDEA光标变成了insert光标状态 且不能编辑操作: https://blog.csdn.net/aosica321/article/details/52787418 ▲.在i ...

  10. ASP.NET Core的身份认证框架IdentityServer4--入门【转】

    原文地址 Identity Server 4是IdentityServer的最新版本,它是流行的OpenID Connect和OAuth Framework for .NET,为ASP.NET Cor ...