【hdoj_1042】N!(大数)
题目: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!(大数)的更多相关文章
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
- 杨氏矩阵:查找x是否在矩阵中,第K大数
参考:http://xudacheng06.blog.163.com/blog/static/4894143320127891610158/ 杨氏矩阵(Young Tableau)是一个很奇妙的数据结 ...
- 蓝桥杯算法提高 P1001(大数乘法)
算法提高 P1001 时间限制:1.0s 内存限制:256.0MB 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法. 具体 ...
- 51nod 1005 大数加法
#include<iostream> #include<string> using namespace std; #define MAXN 10001 },b[MAXN]={} ...
- PHP大数(浮点数)取余
一般我们进行取余运算第一个想到的就是用百分号%,但当除数是个很大的数值,超出了int范围时,这样取余就不准确了. php大数(浮点数)取余函数 /** * php大数取余 * * @param int ...
- HDU 5686 斐波那契数列、Java求大数
原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...
- 区间K 大数查询
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列 ...
随机推荐
- 《Linux内核设计与实现》学习总结 Chap1~2
第一章 Linux内核简介 一.历史 由于Unix系统设计简洁并且在发布时提供源代码,所以许多其他组织和团体都对它进了进一步的开发. Unⅸ虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统 ...
- 「PLC」PLC基本编程
PLC中无非就是三大量:开关量(数字量).模拟量.脉冲量.只在搞清楚三者之间的关系,你就能熟练的掌握PLC了. PLC编程算法(一) 1. 开关量也称逻辑量,指仅有两个取值,0或1.ON或OFF.它是 ...
- [DeeplearningAI笔记]序列模型3.6Bleu得分/机器翻译得分指标
5.3序列模型与注意力机制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.6Bleu得分 在机器翻译中往往对应有多种翻译,而且同样好,此时怎样评估一个机器翻译系统是一个难题. 常见的解决 ...
- OpenCV---环境安装和初次使用
一:环境安装 pip3 install opencv-python #OpenCV模块,必须安装 pip3 install opencv-contrib-python #OpenCV扩展模块,选择安装 ...
- 应用maven自动部署的脚本
@(编程) 最近写了一个自动部署的脚本,可以一键部署到测试服务器或者生产服务器上,包括一个函数脚本和一个调用脚本,比较简单,记录如下. 特点如下: 部署前自动备份 可以部署tomcat项目和java项 ...
- NOIP 2014 提高组 Day2
期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...
- [洛谷P3228] [HNOI2013]数列
洛谷题目链接:[HNOI2013]数列 题目描述 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到: ...
- Elasticsearch Java API 查询
一.查询的时候,需要建立一个SearchRequestBuilder,这里面将给出对于哪一个index或者type进行查询,并且所有的设置都可以在这里面进行实现,例如模糊查询,范围查询,前缀查询等. ...
- js获取上、下级html元素 js删除html元素方法
js获取下级html元素:htmlEle.childNode; js获取上级html元素:htmlEle.parentNode; js删除当前html元素: htmlEle.removeNode(tr ...
- 【BZOJ4565】【HAOI2016】字符合并 [状压DP][区间DP]
字符合并 Time Limit: 20 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为 n 的 01 串,你 ...