大数n的阶乘

[复制链接]
1241|6
 楼主| phosphate 发表于 2019-9-15 17:00 | 显示全部楼层 |阅读模式
      对于比较小的n,求其阶乘的时候可以用递归解决。但是如果n很大的时候,比如1000,那么n!肯定超出整形数据所能表示的范围。因此必须采用其它方法解决,通常解决大数运算数据超出范围的问题时采用数组去模拟。其实求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间临时变量。
     实现代码:
  1. #include<iostream>
  2. #define MAX 1000
  3. using namespace std;

  4. int main(void)
  5. {
  6.     int n;
  7.     while(scanf("%d",&n)==1&&n>=0)
  8.     {
  9.         int i,j;
  10.         int a[MAX];      //存数运算结果
  11.         int p,h;           //p存储当前结果的位数,h为进位
  12.         a[1]=1;
  13.         p=1;  
  14.         for(i=2;i<=n;i++)   //循环与2,3,4.....n相乘
  15.         {
  16.             for(j=1,h=0;j<=p;j++)    //让a[]的每位与i相乘
  17.             {
  18.                 a[j]=a[j]*i+h;
  19.                 h=a[j]/10;
  20.                 a[j]=a[j]%10;
  21.             }
  22.             while(h>0)         //如果h不为0
  23.             {
  24.                 a[j]=h%10;
  25.                 h=h/10;
  26.                 j++;
  27.             }
  28.             p=j-1;            //将当前的位数赋给p
  29.         }
  30.         for(i=p;i>=2;i--)
  31.         {
  32.             printf("%d",a[i]);
  33.         }
  34.         printf("%d\n",a[i]);
  35.     }
  36.     return 0;
  37. }

作者:Matrix海子
    
出处:http://www.cnblogs.com/dolphin0520/
    
本博客中未标明转载的**归作者Matrix海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在**页面明显位置给出原文连接,否则保留追究法律责任的权利。

airwill 发表于 2019-9-22 21:01 | 显示全部楼层
我觉得这里, 数组的长度也是个问题,  因为不容易确定需要多长的数组来存这个结果.   不知道什么好办法来解决呢
ayb_ice 发表于 2019-9-25 13:30 | 显示全部楼层
用双精度浮点不可以吗
airwill 发表于 2019-9-26 22:06 | 显示全部楼层
ayb_ice 发表于 2019-9-25 13:30
用双精度浮点不可以吗

浮点数, 会损失精度哦
ayb_ice 发表于 2019-9-27 08:35 | 显示全部楼层
airwill 发表于 2019-9-26 22:06
浮点数, 会损失精度哦

除非搞基础科研的,实在想不通那么长的数据有什么用呢
airwill 发表于 2019-9-28 08:13 | 显示全部楼层
ayb_ice 发表于 2019-9-27 08:35
除非搞基础科研的,实在想不通那么长的数据有什么用呢

也是啊, 我想若能跑到 64 位整数, 估计现实应用大概不再有限制的感觉了吧
叶春勇 发表于 2019-10-5 10:10 | 显示全部楼层
全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库,
官方网站是:http://gmplib.org/
gmp库有大整数,大浮点数,实数
这个库的大整数库,能满足要求。
这种都是成熟的东西,建议学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

393

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部