南阳oj 大数阶乘 题目28

来源:互联网 发布:iphone移动数据怎么关 编辑:程序博客网 时间:2024/04/30 06:28

啊啊啊啊啊啊啊啊啊学的太少了
<h2>大数阶乘</h2><div class="problem-ins"> 时间限制:<span class="editable highlight" id="problem[time_limit]">3000</span> ms  |            内存限制:<span class="editable highlight" id="problem[memory_limit]">65535</span> KB </div><div class="problem-ins">难度:<span class="editable highlight">3</span></div><div class="clr"></div><dl class="problem-display"><dt>描述 </dt><dd>我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?</dd><div class="clr"></div><dl class="others"><dt>输入</dt><dd>输入一个整数m(0<m<=5000)</dd><dt>输出</dt><dd>输出m的阶乘,并在输出结束之后输入一个换行符</dd><dt>样例输入</dt><dd><pre id="sample_input">50
样例输出
30414093201713378043612608166064768844377641568960512000000000000
来源
经典题目
上传者
张云聪
#include<iostream>#include<iomanip>using namespace std;//存储20000以内的阶乘int a[15470];       //用数组来存储结果,每个元素存一个五位数int main(){    int n;    cin>>n;    a[1]=1;           a[0]=1;       //这个a[0]是个计数器,记录五位数的个数    int up;       //向前一个五位数的进位    for(int i=2;i<=n;++i)         //从2到n的乘数    {                                     up=0;                    //乘完每个乘数进位归零        for(int j=1;j<=a[0];++j)   //已有数值位参与运算        {            a[j] *=i;             //每一个五位数乘以乘数            a[j] +=up;            //加上进位            up=a[j]/100000;        //计算下一个进位            a[j] %=100000;         //当前五位数的值        }        if(up!=0)        {            a[0]++;                //若有进位,计数器加一            a[a[0]]=up;            //存放进位        }    }    if(a[0]==1) cout<<a[1];        else        {            cout<<a[a[0]];            for (int i=a[0]-1;i>0;i--)            {                     cout<<setfill('0')<<setw(5)<<a[i];  //补足五位数            }        }}


0 0
原创粉丝点击