| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3003 人关注过本帖, 2 人收藏
标题:有关阶乘溢出运算
只看楼主 加入收藏
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
结帖率:100%
收藏(2)
已结贴  问题点数:10 回复次数:7 
有关阶乘溢出运算
计算机所能表示与处理的数的有效数字位数是有限的,例如,在字长32位的计算机上运行的程序中可处理的整数的最大值4294967295(232-1),对于求阶乘n!,当n较大时,会产生溢出,为了完成高精度阶乘运算,可以用一个整形数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。

在下不才,请问大侠们:(为了完成高精度阶乘运算,可以用一个整形数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。)具体怎么操作?

搜索更多相关主题的帖子: 计算机 有效数字 十进制 正整数 最大值 
2011-06-18 22:08
ppfly
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:297
专家分:1956
注 册:2009-5-17
收藏
得分:10 
一个高精度阶乘的例子,自己琢磨琢磨。
程序代码:
#include <stdio.h>
void fun(int n);
int a[1000000]={0};
int LengTh=0;
int main()
{
    int i,n;
    while(scanf("%d",&n)!=EOF)
    {
        fun(n);
        for(i=LengTh;i>=0;i--)
            printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}
void fun(int n)
{
    int i,c,m;
    LengTh=0;
    if(n==1)
    {
        a[0]=1;
        LengTh=0;
        return;
    }
    if(n>=2)
    {
        fun(n-1);
        c=0;
        for(i=0;i<=LengTh;i++)
        {
            m=a[i]*n;
            a[i]=(m+c)%10;
            c=(m+c)/10;
        }
        while(c)
        {
            a[i]=c%10;
            i++;
            LengTh++;
            c=c/10;
        }
    }
}

 

********多贴代码,少说空话*******
2011-06-19 01:42
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
收藏
得分:0 
以下是引用ppfly在2011-6-19 01:42:11的发言:

一个高精度阶乘的例子,自己琢磨琢磨。#include  
void fun(int n);
int a[1000000]={0};
int LengTh=0;
int main()
{
    int i,n;
    while(scanf("%d",&n)!=EOF)
    {
        fun(n);
        for(i=LengTh;i>=0;i--)
            printf("%d",a);
        printf("\n");
    }
    return 0;
}
void fun(int n)
{
    int i,c,m;
    LengTh=0;
    if(n==1)
    {
        a[0]=1;
        LengTh=0;
        return;
    }
    if(n>=2)
    {
        fun(n-1);
        c=0;
        for(i=0;i<=LengTh;i++)
        {
            m=a*n;
            a=(m+c)%10;
            c=(m+c)/10;
        }
        while(c)
        {
            a=c%10;
            i++;
            LengTh++;
            c=c/10;
        }
    }
}
 
看了好几次,恕在下能力有限,还是没怎么看懂。不知大侠能否QQ上指导一下,不胜感激。Q:819040665。
2011-06-19 17:55
月破黄昏
Rank: 1
等 级:新手上路
帖 子:17
专家分:7
注 册:2011-5-11
收藏
得分:0 
回复 2楼 ppfly
看了好几次,恕在下能力有限,还是没怎么看懂。不知大侠能否QQ上指导一下,不胜感激。Q:819040665。
2011-06-19 21:54
ouyangouyang
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:273
专家分:579
注 册:2009-10-8
收藏
得分:0 
程序确实不错,赞一个

多少恨, 昨夜梦魂中。 还似旧时游上苑, 车如流水马如龙; 花月正春风!
2011-06-19 23:25
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这种东西也可以用 python 去做。
python 解决数论问题非常强大,理论上支持无限精度~
2011-06-20 01:15
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 2楼 ppfly
这个算法忽略了0!=1,导致算出的0!=0.
2011-07-15 09:13
laznrbfe
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:482
专家分:1599
注 册:2011-5-22
收藏
得分:0 
回复 7楼 laznrbfe
#include <stdio.h>
void fun(int n);
int a[1000000]={0};
int LengTh=0;
int main()
{
    int i,n;
    while(scanf("%d",&n)!=EOF)
    {
        fun(n);
        for(i=LengTh;i>=0;i--)
            printf("%d",a[i]);
        printf("\n");
    }
    return 0;
}
void fun(int n)
{
    int i,c,m;
    LengTh=0;
    if(n==1||n==0)//////////////////////////////修改一下就可以了
    {
        a[0]=1;
        LengTh=0;
        return;
    }
    if(n>=2)
    {
        fun(n-1);
        c=0;
        for(i=0;i<=LengTh;i++)
        {
            m=a[i]*n;
            a[i]=(m+c)%10;
            c=(m+c)/10;
        }
        while(c)
        {
            a[i]=c%10;
            i++;
            LengTh++;
            c=c/10;
        }
    }
}
2011-07-15 09:16
快速回复:有关阶乘溢出运算
数据加载中...
 
   



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

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