51nod 1057

来源:互联网 发布:战舰世界腓特烈数据 编辑:程序博客网 时间:2024/06/05 10:34

这里写图片描述

大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(10000的阶乘的开多大的数组,要是每个数组只开一位的话= =) 。我先把模拟的代码贴上:

#include <iostream>#include <algorithm>#include <string.h>#include <stdlib.h>#include <stdio.h>using namespace std;const int N = 3000000;int arr[N];int main(){    int n,i,j;    while(~scanf("%d",&n))    {        arr[0] = 1;        for(i=2; i<=n; i++)        {            int c = 0;            for(j=0; j<=N; j++)            {                int s = arr[j]*i + c;                arr[j] = s%10;                c = s/10;            }        }        for(i=N; i>=0; i--)            if(arr[i] != 0)                break;       // printf("i=%d\n",i);        for(; i>=0; i--)            printf("%d",arr[i]);        cout<<endl;    }    return 0;    return 0;}

后来找到一个很好的解决方案, 我们可以让一个数组的每一位都存4-7位数字,这样就会节省大量的空间。 这是代码。

#include <iostream>#include <algorithm>#include <string.h>#include <stdlib.h>#include <stdio.h>using namespace std;const int N = 100000;int arr[N];int main(){    int n,i,j,m;    while(~scanf("%d",&n))    {        arr[0] = 1; m = 0;        for(i=2; i<=n; i++)        {            int c = 0;            for(j=0; j<=m; j++)            {                arr[j] = i*arr[j] + c;                c = arr[j] / 100000;/上个代码是%10 , 这里是%100000而已,道理是一样的。                arr[j] = arr[j]%100000;                //printf("%d  ",arr[j]);            }            if(c > 0)                arr[++m] = c;        }        printf("%d",arr[m]); //高位到低位输出        for(i=m-1; i>=0; i--)            printf("%05d",arr[i]);        cout<<endl;    }    return 0;}
0 0
原创粉丝点击