大数——大数阶乘(hdu1042)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1042
题目描述:题目异常的简洁,所以很容易入坑。其实想一想,10000!这个数确实蛮恐怖的~
一、我们设一个递减的整数为n,存放值的字符串为s。每次s内的所有字符都将与n做一次相乘操作,
即循环体内:
s[j]=s[j]*i+k; //k为进位
k=s[j]/10;
s[j]%=10;
那么这个循环究竟循环多少次呢?很明显,是s的有效长度。
那么s的有效长度又是多少呢?
s的值越来越大,长度也是不断的增长。如果我们一开始就将s设置为0000000000000……00000000000000000001
那么会产生无数次无效的运算操作,很显然不是很合理。
所以我们设置一个记录s长度的变量来控制循环的次数,我们假设为t。
n的上限为10000,所以s一次乘操作他的值最大变化为后面加4个0,也就是单次处理 t最多加4。
一个看起来不是很正规但是很简单的处理:if(s[t-3]||s[t-2]||s[t-1]||s[t]) t+=4; 如果s后四位不全是0,那么意味着下次乘操作可能会溢出。
所以再给t补充4位
二、考虑0和1的输入
#include<stdio.h>
#include<string.h>int main()
{int n,i,j,t,k;int s[50001];while(~scanf("%d",&n)){memset(s,0,sizeof(s));if(n==0||n==1)printf("1\n");else{s[0]=1; k=0;t=4;for(i=n;i>=2;i--){for(j=0;j<=t;j++){ s[j]=s[j]*i+k;k=s[j]/10;s[j]%=10;}if(s[t-3]||s[t-2]||s[t-1]||s[t])t+=4;}while(!s[t])t--;for(i=t;i>=0;i--)printf("%d",s[i]);printf("\n");} }return 0;
}
思路2:加法运算是从个位(末端)开始,并且涉及到进位。
大数——大数阶乘(hdu1042)相关推荐
- C语言实现大数的阶乘(附完整源码)
实现大数的阶乘 大数 _large_num结构体 实现了以下相关的几个接口 大数的阶乘完整源码(定义,实现,main函数测试) 大数 _large_num结构体 typedef struct _lar ...
- java大数类阶乘_Java中的大数阶乘
java大数类阶乘 It is not possible to store factorial for large number like 50 into inbuilt data types lik ...
- 求大数的阶乘方法(数组)
主要思想: 由于大数阶乘结果通常非常大,用long long保存都不一定够,因此,大数阶乘不能直接去相乘.可以采用数组存储进位的方法来存储. 例如,定义一个数组a[3],a[2] = 3,a[1] = ...
- 1000的阶乘用c语言实现,用C语言实现计算大数的阶乘
#include #define SIZE 1000 int BigFact(int m, short data[]); int main() { short data[SIZE] = { 0 };/ ...
- C#阶乘类,可以精确计算大数的阶乘,10000的阶乘只要1.3秒左右
关于阶乘,老郭和宝宝等前辈做了大量研究,计算速度也达到了非常快的水准.本文宗旨不在于和他们比快,因为他们专门为阶乘做了很多优化.本文介绍的是使用C#直接计算的方法,速度虽然不能跟他们相比,但在一般场合 ...
- 阶乘类,可以精确计算大数的阶乘,10000的阶乘只要1.3秒左右
关于阶乘,老郭和宝宝等前辈做了大量研究,计算速度也达到了非常快的水准.本文宗旨不在于和他们比快,因为他们专门为阶乘做了很多优化.本文介绍的是使用C#直接计算的方法,速度虽然不能跟他们相比,但在一般场合 ...
- 大数——大数判等(hdu2054)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2054 题目描述:题目比1042还简洁..我们都知道hdu的11页的水题有多水~所以看到这个之后我果断 ...
- 大数——大数相加(hdu1002)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1002 题目描述:ACM入门的第一题,两个超出整型变量范围的整数进行相加运算. 一.因为整型装不下,所 ...
- 大数运算(6)——大数阶乘(求位数)
对于求一个大数的阶乘的位数一般有两种方法: 第一种: lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 =[lgN+lg(N-1)+lg(N-2)+......+lg ...
最新文章
- UNet为什么在医学图像分割表现好?
- 在main()之前,IAR都做了啥?
- 4G EPS 的接口类型
- Google 鼓励的 13 条代码审查标准,建议收藏!
- 跟踪了下CSDN博客之星的竞选数据,我就看看不评论,你怎么看?
- 5.1.2 操作系统控制I/O设备的I/O控制器
- OSG与opengl的shader结合
- 怕入错行?这群技术人写了本“择业指南”
- 使用开源库 Objective-C RegEx Categories 处理正则表达式
- Codeforces Round #223 (Div. 2): E. Sereja and Brackets(线段树)
- Maven项目环境搭建实例.
- nginx 四种策略
- 表单提交后打印后台传过来的数据
- 根据数据库名称glkf查看使用的用户
- k8s之根据tag发布spring boot项目
- vue展示日历 考勤展示_vue实现简单的日历效果
- 安卓rom制作教程_Android ROM制作教程-开发必需
- Cgroup资源配置方法详细解析
- 关于MUI一个很实用的前端框架
- MATLAB—view函数观察三视图
热门文章
- 25 PP模块-创建工厂日历报错-请输入年度xxxx和xxxx之间的有效区域
- oracle substr(table),oracle中的substr()函数
- jwt认证机制优势和原理_微服务统一登录认证怎么做?JWT?
- C++:利用sort()对vector中的数据自定义排序
- 关于在Win10系统将标注软件labelme打包生成.exe可执行文件
- 深度学习logit是什么?
- Kafka单节点多broker的部署和使用
- [Ansys Workbench] 模型网格划分练习
- [UE4]报错:Material with missing usage flag was applied to skeletal mesh 的解决方法:为材质设置相应的 usage flag
- oracle 自带table,Oracle中table函数的使用详解