hdu 1042 N! 大数

这道题一看我知道如果我的第一思路,递归调用函数肯定超时,数太大,于是我就想到了打表。。想开一个二维数组。。可惜。数组太大开不了。这个思路错误的。

在google 搜索了下,在网易博客发现一种超级好的办法。自己的见识太少了。原来对于求大整数的阶乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律。万分感谢。。高人博客网址。

http://happylch21.blog.163.com/blog/static/16563975920106209118434/

现附上他的代码:

#include<stdio.h>
int main()
{
int n,j,i,t,p,sum;
int result[16000];
while(scanf("%d",&n)!=EOF){
t
=p=0;result[0]=1; //t记录result中所存数的个数
for(j=1;j<=n;j++){ //n!=1*2*3*4...*n;
for(i=0;i<=t;i++){
result[i]
=result[i]*j+p;p=0; //如果sum>99999不成立,则不需进位,进位为0
if(result[i]>99999){
p
=result[i]/100000; //进位
result[i]%=100000; //数组sum中每位存5位数字
if(t==i){t++;result[t]=p;p=0;break;} //t在最高位有进位的情况下++,最高位存进位 ,并让进位为0
// 如果进位不为0, 则下一次乘的时候将加上该进位,显然不合理
}
}
}
printf(
"%d",result[t]);//先把最高位输出,因为最高位没有前导0
for(i=t-1;i>=0;i--)
printf(
"%05d",result[i]);//s[i]不足5位,说明需补0 也说明result[i]在对100000取余的时候去掉了前导0,所以这里要加上
printf("\n");
}
return 0;
}

posted on 2011-03-30 09:35  more think, more gains  阅读(179)  评论(0编辑  收藏  举报

导航