HDU-1042 N! 大数乘法 (C语言)
这是一道简单的数学题,求一个数(N)的阶乘。但是问题是题中N给的非常大(0<=N<=10000),用for循环来做显然不行了。这里用数组来对付这些大家伙。基本思路如下:
1.开辟一个够大的数组,保证大于1000!所占的位数,我是以最大情况来估算,即1000个1000相乘,开一百万吧,反正我们老大(Miyu)说了数组空间烂便宜。
2.然后就是挨个来乘了(说白了,就是模拟我们平时的乘法),这里不要惯性的只要看见某位过10便想着进位,虽然这样能做,但艰难。可以让一位存大一点的数值,要知道,对于每一位来说,可以存下一个21亿的数字。
3.如果只是乘,不中途处理一次进位的话,那便永远是在“个位”做乘法了,肯定不行,于是我们每乘2次处理一次进位(理由见代码注释),这样变可解决这个问题了。
代码如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define MAX 1000000 int N,p,res[MAX+1]; int main() { while(scanf("%d",&N)!=EOF) { p=MAX; //定义P为最高位指针. memset(res,0,sizeof(res)); //初始化数组 res[MAX]=1; //由于是乘法,初始化为 1 ,这样0!也就为 1 了 for(int i=2;i<=N;++i) { p-=4; //由于 Lvsi 同志觉得做题目应不止满足于做出 for(int j=MAX;j>=p;--j) //所以改进了一下,由 [MAX->0] 改为每次乘后 res[j]*=i; //开辟四位进位空间,根据乘以最大数10000而来. if(i%2==0||i==N) //让它乘两次处理一次进位,即把每位更新成9以下 { //如果%3的话想想连乘 998 999 1000 之类的肯定,溢出了. for(int j=MAX;j>=p;--j) //最后进位是必须的 { int c=res[j]/10; res[j]%=10; res[j-1]+=c; } } } for(int i=0;i<=MAX;++i) //清除前置的零. { if(res[i]!=0) { p=i; break; } } for(int i=p;i<=MAX;++i) printf("%d",res[i]); puts(""); } //system("pause"); return 0; }
提交用了875MS,努力努力。