| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:关于高精度阶乘的计算
只看楼主 加入收藏
chuifeng56
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-6-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
关于高精度阶乘的计算
a数组依序存储计算结果的个十百千各位,B数组作为进位数组。


写的代码如下:
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int a[1500]={1},b[1500]={0},max=1,N,i,m;
    printf("input value of N\n");
    scanf("%d",&N);
    for(m=2;m<=N;m=m+1)
    {
        for(i=0;i<=max;i=i+1)
        {
            a[i]=m*a[i]+b[i];
                b[i+1]=a[i]/10;
            a[i]=a[i]-10*b[i+1];
        }
            if(a[max]!=0)
            {
                max=max+1;
            }
    }
    printf("%d!=",N);
    for(i=(max-1);i>=0;i--)
    {
        printf("%d",a[i]);   
        if(i==0)
        {
            printf("\n");
        }
    }
    system("pause");
}

遇到个问题,每十五个数(比如15!,30!),计算的结果会缺一位,比如结果是XYZ,而输出的结果会只有YZ。
这种情况只有当N为15的倍数的时候才会出现。
想了好久都想不明白,求高人指教
搜索更多相关主题的帖子: 阶乘 高精度 
2010-06-29 12:08
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:5 
不是少位。
当 n > 14 时,程序计算结果不对。

程序得到的结果:
14!=87178291200
15!=307674368000
16!=4922789888000

17!=83687428096000

29!=884036789954543616000000   
30!=6521103698636308480000000
31!=2154214657725562880000000

44!=429444223383405394319638528000000000
45!=9324990052253242744383733760000000000
46!=28949542403649166241651752960000000000


计算出来的结果:
14!=87178291200
15!=1307674368000
16!=20922789888000
17!=355687428096000

29!=8841761993739701954543616000000   
30!=2.6525285981219105863630848e+32
31!=8.22283865417792281772556288e+33

44!=2.6582715747884487680436258110146e+54
45!=1.1962222086548019456196316149566e+56
46!=5.5026221598120889498503054288003e+57

差别太大,程序出了点问题。
2010-06-29 13:01
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:0 
好象问题出在这里:  
  for(i=0;i<=max;i=i+1)
        {
            a[i]=m*a[i]+b[i];
                b[i+1]=a[i]/10;
            a[i]=a[i]-10*b[i+1];
        }
但还没有想出症结在什么地方。
2010-06-29 13:44
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:5 
看了半天!爱莫能助!帮顶
2010-06-29 15:56
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int a[1500]={1},b[1500]={0},max=1,N,i,m;
    printf("input value of N\n");
    scanf("%d",&N);
    for(m=2;m<=N;m=m+1)
    {
        for(i=0;b[i]!=0||i<max+1;i=i+1)
//进位不为空的时候必须还得循环
        {
            a[i]=m*a[i]+b[i];
            b[i+1]=a[i]/10;
            a[i]=a[i]-10*b[i+1];
//判断a[max]必须在循环体内,因为当数大了,不止只有一位进位
            if(a[max]!=0)
            {
                max=max+1;
            }
        }
    }
    printf("%d!=",N);
    for(i=(max-1);i>=0;i--)
    {
        printf("%d",a[i]);   
        if(i==0)
        {
            printf("\n");
        }
    }
    system("pause");
}
2010-06-29 17:06
rainbow1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:277
专家分:839
注 册:2010-5-19
收藏
得分:0 
楼上正解。咱也找到问题了。
2010-06-29 18:37
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:0 
回复 5楼 linjx0123
麻烦你能解释一下你是怎么发现问题的呢?一个个试吗?我今天试了感觉太复杂了,就没成功!能给解释一下你当时发现问题的思路吗
2010-06-29 21:59
hdshdzh
Rank: 2
等 级:论坛游民
帖 子:77
专家分:11
注 册:2010-5-13
收藏
得分:5 
如果是用TC的话注意类型int long int
2010-06-30 09:24
linjx0123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:279
专家分:1362
注 册:2006-4-7
收藏
得分:0 
回复 7楼 遮天云
看了他的程序,就知道是进位出了问题,而他设置max每次只加1位,且在循环体外,我就自然想到了,要是进位有5位怎么办,而进位为5位是存在的,a[i]*m, 假设m为11111,a[i]为9就有好多进位了。所以问题自然就明了了。
2010-06-30 10:33
快速回复:关于高精度阶乘的计算
数据加载中...
 
   



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

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