51nod1057-N的阶乘(大数乘法巧解)
这道大数乘法开始我是想套板子模拟的。。然后就发现2/3的例子都wa了。(惊了)。然后在思考后发现n2的板子的确过不了这么多的大数。(不看题的下场)。所以,我在网上发现了分块求大数的方法。%%% 思路来自这位大佬的帖子>>http://blog.csdn.net/f_zyj/article/details/51187056<<
总的来说,就是把这个乘积分成8位数(自己定)一小块,然后考虑进位,最后倒着输出来就行。
代码如下:
#include<iostream> #include<stdio.h> using namespace std; int main() { long mod=100000000;//这里取模,可以保证每一个块都为8位数 long long a[10005]; long long n,i,j,k,l,c; cin>>n; l=0; a[0]=1; for(i=1;i<=n;i++) { c=0; for(j=0;j<=l;j++) { a[j]=a[j]*i+c; c=a[j]/mod; a[j]%=mod; } if(c>0) { l++; a[l]=c; } } printf("%lld",a[l]); for(i=l-1;i>=0;i--) { printf("%08lld",a[i]);//注意输出的格式,如果格式错误会导致许多0消失 } printf("\n"); }