打印

大数n的阶乘

[复制链接]
954|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
phosphate|  楼主 | 2019-9-15 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      对于比较小的n,求其阶乘的时候可以用递归解决。但是如果n很大的时候,比如1000,那么n!肯定超出整形数据所能表示的范围。因此必须采用其它方法解决,通常解决大数运算数据超出范围的问题时采用数组去模拟。其实求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间临时变量。
     实现代码:
#include<iostream>
#define MAX 1000
using namespace std;

int main(void)
{
    int n;
    while(scanf("%d",&n)==1&&n>=0)
    {
        int i,j;
        int a[MAX];      //存数运算结果
        int p,h;           //p存储当前结果的位数,h为进位
        a[1]=1;
        p=1;  
        for(i=2;i<=n;i++)   //循环与2,3,4.....n相乘
        {
            for(j=1,h=0;j<=p;j++)    //让a[]的每位与i相乘
            {
                a[j]=a[j]*i+h;
                h=a[j]/10;
                a[j]=a[j]%10;
            }
            while(h>0)         //如果h不为0
            {
                a[j]=h%10;
                h=h/10;
                j++;
            }
            p=j-1;            //将当前的位数赋给p
        }
        for(i=p;i>=2;i--)
        {
            printf("%d",a[i]);
        }
        printf("%d\n",a[i]);
    }
    return 0;
}

作者: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
用双精度浮点不可以吗

浮点数, 会损失精度哦

使用特权

评论回复
5
ayb_ice| | 2019-9-27 08:35 | 只看该作者
airwill 发表于 2019-9-26 22:06
浮点数, 会损失精度哦

除非搞基础科研的,实在想不通那么长的数据有什么用呢

使用特权

评论回复
6
airwill| | 2019-9-28 08:13 | 只看该作者
ayb_ice 发表于 2019-9-27 08:35
除非搞基础科研的,实在想不通那么长的数据有什么用呢

也是啊, 我想若能跑到 64 位整数, 估计现实应用大概不再有限制的感觉了吧

使用特权

评论回复
7
叶春勇| | 2019-10-5 10:10 | 只看该作者
全称是GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库,
官方网站是:http://gmplib.org/
gmp库有大整数,大浮点数,实数
这个库的大整数库,能满足要求。
这种都是成熟的东西,建议学习。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

393

帖子

1

粉丝