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

 

posted @ 2017-11-30 16:56  啾啾猫猫  阅读(411)  评论(0编辑  收藏  举报