| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4225 人关注过本帖
标题:问个关于高精度n阶乘的
只看楼主 加入收藏
守望天空
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-4-16
收藏
 问题点数:0 回复次数:10 
问个关于高精度n阶乘的
虽然 燕子 和孔明 的算法与代码都是很经典的,但是做为菜鸟,简单易懂的就好



首先,定义两个整型的数组:
int fac[1000];暂且先设定是1000位,我称之为“结果数组”
int add[1000];我称之为“进位数组”

现在具体说明两个数组的作用:

1.fac[1000]
比如说,一个数5的阶乘是120,那么我就用这个数组存储它:
fac[0]=0
fac[1]=2
fac[2]=1
现在明白了数组fac的作用了吧。用这样的数组我们可以放阶乘后结果是1000位的数。

2.在介绍add[1000]之前,我介绍一下算法的思想,就以6!为例:
 从上面我们知道了5!是怎样存储的。
 就在5!的基础上来计算6!,演示如下:

fac[0]=fac[0]*6=0
fac[1]=fac[1]*6=12
fac[2]=fac[2]*6=6

3.现在就用到了我们的:“进位数组”add[1000].
 先得说明一下:add就是在第2步中用算出的结果中,第i位向第i+1位的进位数值。还是接上例:
add[0]=0;
add[1]=1;  // 计算过程:就是 (fac[1]+add[0])  %  10=1
add[2]=0;  /*计算过程:就是 (fac[2]+add[1]) % 10=0
add[i+1] =( fac[i+1] + add[i] ) % 10    这个
现在就知道了我们的数组add[]是干什么的了吧,并且明白了add是如何求得的了吧。
4.知道了add[1000]的值,现在就在 1. 和 3 . 两步的基础上来计算最终的结果。(第2步仅作为我们理解的步骤,我们下面的计算已经包含了它)
fac[0] = ( fac[0]*6 )  mod 10 =0  
fac[1] = ( fac[1]*6 + add[0] ) mod 10 =2
fac[2] = ( fac[2]*6 + add[1] ) mod 10=7    //data[j+1]=(data[j+1]*i+add[j])%10
到这里我们已经计算完了6!。然后就可以将数组fac[1000]中的数,以字符的形式按位输出到屏幕上了。
5.还有一点需要说明,就是我们需要一个变量来记录fac[1000]中实际用到了几位,比如5!用了前3位;
我们在这里定义为 top  
      为了计算top,我们有用到了add[1000],还是以上面的为例:
    5!时,top=3,在此基础上我们来看6!时top=?
      由于  add[2]=0
      所以  top=3(没有变)
也就是说,如果最高位有进位时,我们的top=top+1,否则,top值不变。
6.总结一下,可以发现,我们把阶乘转化为 两个10以内的数的乘法,还有两个10以内的数的家法了。
  因此,不管再大的数,基本上都能算出了,只要你的数组够大就行了。




这个是网上看到的酸法,但是有几点比较不懂,

1  fac[1000]
比如说,一个数5的阶乘是120,那么我就用这个数组存储它:
fac[0]=0
fac[1]=2
fac[2]=1  这一个中怎么去把每个位的数字放如fac[]中 啊,如果是比较小的数可以除看看是几位数,但是数字一大的话总不能每个位去余把.
这个要怎么弄啊?


2 我的打算 就是用i,j,n三个int的树  fac[j]   (i是n循环的变量) for(i=1;i<n;i++)  ????(n是从键盘读入的要计算阶乘的数字)
另外就是j这个循环是要循环到哪个树啊?   n或者1000?
3
上面的算法里面有提到哪个用定义top的方法,用字符输出int类型会不会出现错误啊?

4另外输出的问题,输出的是要怎么样去写啊 ?
printf("%d",fac[j])   ??????


[[it] 本帖最后由 守望天空 于 2008-9-12 09:27 编辑 [/it]]
搜索更多相关主题的帖子: 阶乘 
2008-09-12 09:10
gongjiandenghua
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-09-12 09:51
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
从网上看到的好的代码

我建议你抄到笔记本上  然后再去思考

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-12 12:21
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
[bo][un]守望天空[/un] 在 2008-9-12 09:10 的发言:[/bo]

虽然 燕子 和孔明 的算法与代码都是很经典的,但是做为菜鸟,简单易懂的就好



首先,定义两个整型的数组:
int fac[1000];暂且先设定是1000位,我称之为“结果数组”
int add[1000];我称之为“进位数组”
 ...


爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-12 12:29
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
貌似燕子的代码展开了就是很好懂的。。。。

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-09-12 12:32
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
关键是没展开

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-12 12:33
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1692
专家分:4262
注 册:2007-12-27
收藏
得分:0 
高精度运算总的思想都是这样的,再有改进也无非是每个int数组元素保存9位十进制而不是1位这样来节约空间。

to LZ:
1、阶乘是从1算起的,不存在事先把一个很大的数往数组里面放的问题。
2、您的问题错别字太多兼语无伦次,看不懂。
3、4、输出不是真的按照字符的,而是循环输出每一位(都是int),类似于:

for(i=top-1;i>=0;i--)
  printf("%d",fac[i]);
2008-09-12 18:18
sunhui
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2010-8-18
收藏
得分:0 
不错·
2010-08-19 10:40
kxywnljz
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2010-11-4
收藏
得分:0 
楼主,你让我明白了,谢谢你,我永远爱你!我的QQ591197843,看得起兄弟,还望加我为好友!
2010-11-25 22:53
sjdskl
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-1
收藏
得分:0 
#include<iostream>
#define Max 10001
using namespace std;

int fac[Max],add[Max],top=1;

void bigfac(int n)
{
    int i,j;
    for(i=2;i<=n;i++)//从阶乘4开始,其它忽略
    {
        for(j=1;j<=top;j++)
        {
            add[j]=(fac[j]*i+add[j-1])/10;//下一位的进位
            fac[j]=(fac[j]*i+add[j-1])%10;
            if(add[top]>=1)
            {
                top++;
            }
        }
    }
}




int main()
{
    int i,n;
    memset(fac,0,sizeof(fac));
    memset(add,0,sizeof(add));
    fac[1]=1;
    cin>>n;
    bigfac(n);
    for(i=top;i>=1;i--)
    {
        cout<<fac[i];
    }
    cout<<endl;

}
根据楼主的意思写出来的  不知道对不对!
2011-04-09 22:33
快速回复:问个关于高精度n阶乘的
数据加载中...
 
   



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

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