免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10346 | 回复: 13
打印 上一主题 下一主题

[函数] 大数阶乘的函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-14 11:20 |只看该作者 |倒序浏览
在GCC中如果计算超过double的大整数的阶乘,用什么函数?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-14 11:34 |只看该作者

大数阶乘的函数

阶乘?有函数计算阶乘吗?自己写函数吧。如果数据过大,可以考虑自己编写数据存储格式,并编写相应的计算规则。

论坛徽章:
0
3 [报告]
发表于 2004-12-14 15:54 |只看该作者

大数阶乘的函数

在32位PC上从1到12的阶乘还可以算出正确结果,比如,12!=479001600
而算到13时结果就不正确了,程序如下。

  1. #include<iostream>;
  2. using namespace std;

  3. template <class T>;
  4. T factorial(T n)
  5. {
  6. if (n>;1)
  7.         return (n*factorial(n-1));
  8. else
  9.         return 1;
  10. }

  11. int main(void)
  12. {
  13.         long a;
  14.         cout<<"input a number: ";
  15.         cin>;>;a;
  16.         cout<<a<<" != "<<factorial(a);
  17.         cout<<endl;
  18.         return 0;
  19. }
复制代码

谁给指点一下,使它能处理任意大的整数?

论坛徽章:
0
4 [报告]
发表于 2004-12-14 16:27 |只看该作者

大数阶乘的函数

猜想是到了13的时候已经数据溢出了,对大数阶乘应该自己定义类型来保存数据。

论坛徽章:
0
5 [报告]
发表于 2004-12-14 16:48 |只看该作者

大数阶乘的函数

[quote]原帖由 "pgy"]在GCC中如果计算超过double的大整数的阶乘,用什么函数?[/quote 发表:


如果用 double,应该可以得到近似解,建议用如下的公式:

stl.JPG (7.62 KB, 下载次数: 58)

stirling's formula

stirling's formula

论坛徽章:
0
6 [报告]
发表于 2004-12-14 17:05 |只看该作者

大数阶乘的函数

如果要得到精确解,则需处理大整数,建议用 libgmp。


  1. #include "gmp.h"

  2. int
  3. main()
  4. {
  5.         mpz_t res;

  6.         mpz_init (res);

  7.         mpz_fac_ui (res, 1000);

  8.         mpz_out_str (stdout, 10, res);

  9.         putchar ('\n');

  10.         return 0;
  11. }
复制代码



[zxl@AMD64 guile]$ cc 1.c -lgmp
[zxl@AMD64 guile]$ ./a.out
40238726007709377354370243392300398571937486421071463
25437999104299385123986290205920442084869694048004799
88610197196058631666872994808558901323829669944590997
42450408707375991882362772718873251977950595099527612
08749754624970436014182780946464962910563938874378864
87337119181045825783647849977012476632889835955735432
51318532395846307555740911426241747434934755342864657
66116677973966688202912073791438537195882498081268678
38374559731746136085379534524221586593201928090878297
30843139284440328123155861103697680135730421616874760
96758713483120254785893207671691324484262361314125087
80208000261683151027341827977704784635868170164365024
15369139828126481021309276124489635992870511496497541
99093422215668325720808213331861168115536158365469840
46708975602900950537616475847728421889679646244945160
76535340819890138544248798495995331910172335555660213
94503997362807501378376153071277619268490343526252000
15888535147331611702103968175921510907788019393178114
19454525722386554146106289218796022383897147608850627
68629671466746975629112340824392081601537808898939645
18263243671616762179168909779911903754031274622289988
00519544441428201218736174599264295658174662830295557
02990243241531816172104658320367869061172601587835207
51516284225540265170483304226143974286933061690897968
48259012545832716822645806652676995865268227280707578
13918581788896522081643483448259932660433676601769996
12831860788386150279465955131156552036093988180612138
55860030143569452722420634463179746059468257310379008
40244324384656572450144028218852524709351906209290231
36493273497565513958720559654228749774011413346962715
42284586237738753823048386568897646192738381490014076
73104466402598994902222217659043399018860185665264850
61799702356193897017860040811889729918311021171229845
90164192106888438712185564612496079872290851929681937
23886426148396573822911231250241866493531439701374285
31926649875337218940694281434118520158014123344828015
05139969429015348307764456909907315243327828826986460
27898643211390835062170950025973898635542771967428222
48757586765752344220207573630569498825087968928162753
84886339690995982628095612145099487170124451646126037
90293091208890869420285106401821543994571568059418727
48998094254742173582401063677404595741785160829230135
35808184009699637252423056085590370062427124341690900
41536901059339838357779394109700277534720000000000000
00000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000
000000000000000000000000
[zxl@AMD64 guile]$

论坛徽章:
0
7 [报告]
发表于 2004-12-14 17:48 |只看该作者

大数阶乘的函数

自己写个函数。

我记得有个ACM的考题,就大数的N次方计算。把大数变成数组,用多项式,就可以实现精确计算了。

论坛徽章:
0
8 [报告]
发表于 2004-12-14 22:04 |只看该作者

大数阶乘的函数

我以前编过一个程序用来求大数的阶乘,不果方法很笨就是先定义一个比较大的数组来存放阶乘的每一个元素.
int data[100];
int tmp; //数据位数变量
int i,j,r,k;
int n; //用户输入值

for( i=1; i<n+1;i++ )
(
     for( j=1; j<tmp+1; j++ )
          data[j]*=i;
     for( j=1; j<tmp+1; j++ )
     {
          if(data[j]>;10)
          {
               for( r=1; r<tmp+1; r++ )
               {
                     if(data[tmp]>;10)
                          tmp++;
                      data[r+1] += data[r]/10;
                      data[r] = data[r]%10;
                }
           }
      }
      printf("%d != ",i);
      for( k=tmp; k>;0; k--) //输出数组中的内容
           printf("%d",data[k]);
      printf("\n";
}

论坛徽章:
0
9 [报告]
发表于 2004-12-16 10:08 |只看该作者

大数阶乘的函数

感谢各位朋友相助!
我试过了,win_hate提供的库很好用,谢谢!想请教,这些库都没有在教科书中提现,用的时候也不知道有这么个东西,这不是很让人头疼的事情吗?敢问win_hate如何积累这些知识的呢,或者有个网站提供这些库的查询服务?

论坛徽章:
0
10 [报告]
发表于 2004-12-16 12:15 |只看该作者

大数阶乘的函数

在 google 上查。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP