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 ;
}

转载于:https://www.cnblogs.com/tangcong/archive/2011/03/30/1999457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值