hdu 1042 N!(大数)
2024-10-11 00:27:16
题意:求n!(0 ≤ N ≤ 10000)
思路:大数,用数组存储
1.首先要考虑数据N!的位数,因为最大是10000!,可以计算一下大概是5+9000*4+900*3+90*2+10*1=38865位,(此处没看懂,怎么求的)
可以开一个40000的int数组存放,然后用常规的方法去计算
2.但是需要改进一下,咱们知道int数组一个只存1位太浪费了,不如让它的空间发挥到极限,数组一个元素存一个不超过10^5的数,
为什么是10^5呢?见代码中的注释,改进后就一个元素存5位,这样开的数组就可以小5倍了,只需要8000就可以了
代码1:
#include<cstdio>
#include<cstring> const int N=40000;
int main(){
int ans[N];
int n,i,j,co,sum;
while(~scanf("%d",&n)){
memset(ans,0,sizeof(ans));
ans[0]=1;
for(i=2;i<=n;i++){
for(j=0,co=0;j<N;j++){//求阶乘
sum=ans[j]*i+co;//
ans[j]=sum%10;
co=sum/10;
}
}
for(i=N-1;ans[i]==0;i--);
printf("%d",ans[i]);
for(i--;i>=0;i--) printf("%d",ans[i]);
printf("\n");
}
return 0;
}
代码2:
#include<cstdio>
#include<cstring> const int N=8000;
int main(){
int ans[N];
int n,i,j,co,sum;
while(~scanf("%d",&n)){
memset(ans,0,sizeof(ans));
ans[0]=1;
for(i=2;i<=n;i++){
for(j=0,co=0;j<N;j++){//求阶乘
sum=ans[j]*i+co;//这里的sum决定了10^5,因为ans[j]<10^5,i<10^4,co<10^5,那么sum不会超出int范围;如果用10^6,则sum可能溢出。
ans[j]=sum%100000;
co=sum/100000;
}
}
for(i=N-1;ans[i]==0;i--);
printf("%d",ans[i]);
for(i--;i>=0;i--) printf("%05d",ans[i]);
printf("\n");
}
return 0;
}
最新文章
- 个推,手机推送API的使用
- Linux下Vi/Vim使用笔记
- storm-kafka组件中KafkaOffsetMetric相关统计指标说明
- BeanUtil体会
- COJ980 WZJ的数据结构(负二十)
- .Net需要掌握的知识
- 在唯一密钥属性“name”设置为“ScriptHandlerFactory”时,无法添加类型为“add”的重复集合项
- Ninject依赖注入——构造函数的注入
- JS加载时间线
- HTML5-draggable(拖放)
- SharePoint 2010 master page 控件介绍(2):ribbon (一同事读听着像泪奔)
- WPF ItemsControl 控件支持鼠标滚轮滑动
- 解决DataGridView.DataSource重复赋值而不显示问题
- POJ 3264-Balanced Lineup(段树:单点更新,间隔查询)
- 【one day one linux】find 用法详解小记
- PHP之this和self
- JS生成 UUID的方法
- Problem A: 重载字符的加减法
- Windows系统下安装zabbix客户端
- PM2来部署nodejs服务器永久开启
热门文章
- HDoj-1233-还是畅通project-prim算法
- css:颜色名和十六进制数值
- zabbix agent shell一键安装脚本
- js 显示当前系统时间
- 多媒体开发之rtp打包---打包中的FU-A分包方式说明
- 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流
- EasyPlayer RTSP Android安卓播放器实现视频源快速切换
- VC项目文件说明
- 九度OJ 1161:Repeater(复制器) (递归)
- Python爬虫-- BeautifulSoup库