HDU1042 N!(大数问题,万进制)
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1042
N!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 89320 Accepted Submission(s): 26376
Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
Input
One N in one line, process to the end of file.
Output
For each N, output N! in one line.
Sample Input
1
2
3
Sample Output
1
2
6
分析:
采用万进制
万进制原理如下:
比如:107924372*15=1618865580。
四位一分,所以a[0]=4372,a[1]=790,a[2]=1;
a[0]*15=4372*15+0(低位的进位)=65580,所以进位为65580/10000=6,余数为65580%10000=5580,a[0]=5580
a[1]*15=792*15+6(低位的进位)=11886,所以进位为11886/10000=1,余数11886%10000=1886,[1]=1886
a[2]*15=1*15+1(低位的进位)=16,所以进位为16/10000=0,余数16%10000=16,a[2]=16
所以结果为a[2]a[1]a[0]=16 1886 5580
如果a[1]=886的话,不满足四位,要在高位补0,那么这个时候的结果为:16 0886 5580
只有最高位在不满足四位的情况不需要补0,其余都需要
代码如下:
#include<bits/stdc++.h> //采用万进制 int main() { int n; while(~scanf("%d",&n)) { int a[40000]; int l=0;//位数 a[0]=1;//初始化 for(int i=1;i<=n; i++)//求阶乘 { int c=0; for(int j=0; j<=l; j++) { a[j]=a[j]*i+c;//该位的结果:该位数字乘以i,再加上低位的进位 c=a[j]/10000;//进位 a[j]=a[j]%10000;//余数 } if(c>0)//最后还是有进位的情况 { l++;//位数加一 a[l]=c;//进位直接赋值 } } printf("%d",a[l]);//先输出最高位 for(int i=l-1; i>=0; i--) printf("%04d",a[i]);//除最高位以外,每位不足4位的时候前面补0 printf("\n"); } }
心之所向,素履以往
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南