加入收藏 | 设为首页 | 会员中心 | 我要投稿 济源站长网 (https://www.0391zz.cn/)- 数据工具、数据仓库、行业智能、CDN、运营!
当前位置: 首页 > 大数据 > 正文

51nod 1057

发布时间:2021-01-17 06:02:58 所属栏目:大数据 来源:网络整理
导读:大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(10000的阶乘的开多大的数组,要是每个数组只开一位的话= =) 。我先把模拟的代码贴上: #include iostream #include algorithm #include string.h #include stdlib.h #inc

这里写图片描述

大数题,本来用模拟写的, 但是很多数据都超时了。 后来想了一下,不超时也是报精度(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=%dn",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,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;
}

(编辑:济源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读