• NYOJ 28 (大数阶乘)


    我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
    输入
    输入一个整数m(0<m<=5000)
    输出
    输出m的阶乘,并在输出结束之后输入一个换行符
    样例输入
    50
    样例输出

    30414093201713378043612608166064768844377641568960512000000000000

    因为阶乘的结果非常长,设置一个tail,来指向最高位。

    大数阶乘的模版

    //a[] 中倒序存放被乘数
    //b 为乘数
    //tail指向最高位
    
    //原理:用乘数去乘被乘数中的每一位(从低位到高位),再加上上一次运算的进位,将结果的最低位保留,进位储存参加下一次运算
    
    int tail=0;   //指向存放数据数组的最后一个位置
    int value;    //每一位的数值
    int carry=0;  //进位
    
    for(int j=0; j<=tail; j++)
    {
        value=a[j]*b+carry; //每一位的运算结果
        a[j]=value%10;       //将最低位保留在原位置
        carry=value/10;     //计算进位
    
        if(carry!=0&&j==tail)  //当j循环到最后一位时,仍然有进位
        {
            tail++;            //已存放数据的数组后面长度+1来存放最后一个进位数
        }
    }


    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a[20000]={0};  
        int n;
        while(cin>>n)
        {
            int tail=0;   //指向存放数据数组的最后一个位置
            int value;    //每一位的数值
            int carry=0;  //进位
            
            a[0]=1;  //阶乘从1开始
            
            for(int i=2; i<=n; i++)  //1*2  1*2*3   1*2*...*n
            {
                for(int j=0; j<=tail; j++)
                {
                    value=a[j]*i+carry; //每一位的运算结果
                    a[j]=value%10;       //将最低位保留在原位置
                    carry=value/10;     //计算进位
                    
                    if(carry!=0&&j==tail)  //当j循环到最后一位时,仍然有进位
                    {
                        tail++;            //已存放数据的数组后面长度+1来存放最后一个进位数
                    }
                }
            }
    
    
            for(int i=tail; i>=0; i--)//输出
            {
                cout<<a[i];
            }
            cout<<endl;
        }
        return 0;
    }
    


  • 相关阅读:
    linux文件IO操作篇 (二) 缓冲文件
    信号量和互斥锁的区别
    linux 无锁化编程
    C语言中 time相关的函数 头文件
    printf 打印字体和背景带颜色的输出的方法
    在win10环境下安装Cygwin,可以GCC编译
    学习《大话存储》
    linux内核态和用户态的信号量
    学习Makefile
    git 环境搭建
  • 原文地址:https://www.cnblogs.com/zhanyeye/p/9746124.html
Copyright © 2020-2023  润新知