51Nod 1057 N的阶乘(基础题???数论???)

来源:互联网 发布:windows更新 编辑:程序博客网 时间:2024/06/08 16:25

输入N求N的阶乘的准确值。
Input
输入N(1 <= N <= 10000)
Output
输出N的阶乘
Input示例
5
Output示例
120

把这种题放在基础题。。。也太打击人的自信了吧。。。
基础题都刷不了。。。

本来套了个大数相加的板子,一种是大数乘大数,一种是大数乘整数,前者MLE,后者TLE。

然后看了下题解发现…阶乘竟然还能这样求…长见识了!

每八位存一次,如果乘积超过八位就进位。小学乘法。。。(至于存多少位完全看自己意愿)

举个例子模拟下过程:比如,21乘以6,然后得126再乘以12
假设以二位为基准存在数组里:
21*6得出的126,使a[0]=26,a[1]=1;
接着计算26*12得312,使a[0]=12,百位的3进位,之前的百位a[1]=1, 1 * 12+3=15,使a[1]=15。
这样直接格式化逆序输出数组a就是想要的结果了。

大神就是大神,打死我我也想不出来这种做法。
但是,虽然我不会,但是我可以学!嗯!
现在,我学会了。

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>#include<algorithm>using namespace std;typedef long long int LL;const int MAX(100000000);LL ans[100000+50];int main(){    ios_base::sync_with_stdio(false);    cin.tie(0);    cout.tie(0);    int n;    cin>>n;    ans[0]=1;    int len=0;    for(int i=1; i<=n; i++)    {        int temp=0;        for(int j=0; j<=len; j++)        {            ans[j]=ans[j]*i+temp;            temp=ans[j]/MAX;            ans[j]%=MAX;        }        if(temp>0)//进位            ans[++len]=temp;    }    printf("%lld",ans[len]);    for(int i=len-1;i>=0;i--)        printf("%08lld",ans[i]);    printf("\n");}
原创粉丝点击