| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 701 人关注过本帖
标题:高精度阶乘,超时求优化
只看楼主 加入收藏
love24114
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:223
专家分:399
注 册:2011-7-11
结帖率:81.48%
收藏
已结贴  问题点数:20 回复次数:6 
高精度阶乘,超时求优化

http://acm.

#include <iostream>
#define maxlen 100000
using namespace std;
struct HP
{
    int len,s[maxlen];
};
void PrintHP(HP x)
{
    for (int i=x.len;i>=1;i--)
        cout<<x.s[i];
}
void Int2HP(int a,HP &x)
{
    if (a==0)
    {
        x.len=1;x.s[1]=0;return;
    }
    for (x.len=0;a>0;)
    {
        x.s[++x.len]=a%10;
        a/=10;
    }
}
void Multi(const HP a,const HP b,HP &c)
{
    int i,j;
    c.len=a.len+b.len;
    for (i=1;i<=c.len;i++) c.s[i]=0;
    for (i=1;i<=a.len;i++)
        for (j=1;j<=b.len;j++)
            c.s[i+j-1]+=a.s[i]*b.s[j];
    for (i=1;i<c.len;i++)
    {
        c.s[i+1]+=c.s[i]/10;
        c.s[i]%=10;
    }
    while (c.s[i])
    {
        c.s[i+1]=c.s[i]/10;
        c.s[i]%=10;
        i++;
    }
    while (i>1 && !c.s[i])
    {
        i--;
        c.len=i;
    }
}
int main()
{

        HP ans,temp,inte;
        int a,i;
        while (cin>>a )
        {
            if (a)
            {
                temp.s[1]=1;
                temp.len=1;
                for (i=1;i<=a;i++)
                {
                    Int2HP(i,inte);
                    Multi(temp,inte,ans);
                    temp=ans;
                }
                PrintHP(ans);
                cout<<endl;
            }
        }
}

[ 本帖最后由 love24114 于 2012-1-24 11:34 编辑 ]
搜索更多相关主题的帖子: void 优化 return 
2012-01-24 11:17
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
看来今天玩算法的都不在,我拿手机上网,写字不方便。明天再聊

重剑无锋,大巧不工
2012-01-24 19:14
墨清扬
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:294
专家分:817
注 册:2011-10-4
收藏
得分:5 
#include "stdio.h"
int main()
{
    int m,top=0,i=1,j;
    int str[100000]={1,0};
    scanf("%d",&m);
    while(i<=m)
    {
        for(j=0;j<=top;++j)
            str[j]*=i;
        for(j=0;j<=top||str[j]>0;++j)
        {
            str[j+1]+=str[j]/10;
            str[j]%=10;
        }
        top=j;
        if(str[top]==0)
            --top;
        ++i;
    }
    for(;top>=0;--top)
        putchar(str[top]+'0');
    return 0;
}
这个也不好……占用空间大,慢,如果想到更好的再告诉你吧

酱油实习生
2012-01-25 00:01
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:15 
111640 beyondyf 大数阶乘 Accepted 72 228 C/C++ 01-25 11:27:19
查了一下,这是南阳理工这一题速度最快的提交。
程序代码:
#include<stdio.h>
#define BASE            100000
#define BASE_FORMAT     "%05d"
#define LENGTH          3266
void print_factorial(int n)
{
    int a[LENGTH] = {1};
    int i, j, f, len;
    for(len = 1, i = 2; i <= n; i++)
    {
        for(f = j = 0; j < len; j++)
        {
            if(!(a[j] || f)) continue;
            a[j] = a[j] * i + f;
            f = a[j] / BASE;
            a[j] %= BASE;
        }
        if(f) a[len++] = f;
    }
    printf("%d", a[--len]);
    while(len--) printf(BASE_FORMAT, a[len]);
}
int main(void)
{
    int n;
    scanf("%d", &n);
    print_factorial(n);
    return 0;
}

重剑无锋,大巧不工
2012-01-25 11:42
love24114
Rank: 5Rank: 5
等 级:职业侠客
威 望:1
帖 子:223
专家分:399
注 册:2011-7-11
收藏
得分:0 
佩服,大牛啊!!!厉害
2012-01-25 17:32
无界追踪
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-3-22
收藏
得分:0 
进制为什么一直要搞成10,我觉的用长整形,把进度设为1000000会更好一些
2012-04-10 13:25
无界追踪
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-3-22
收藏
得分:0 
回复 3楼 墨清扬
大哥,你那个能运行吗
2012-04-10 13:33
快速回复:高精度阶乘,超时求优化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024838 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved