NYOJ-大数阶乘

来源:互联网 发布:模拟教学软件 编辑:程序博客网 时间:2024/05/31 19:12

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

50

样例输出

30414093201713378043612608166064768844377641568960512000000000000

#include <stdio.h>#include <string.h>#define MAX 20000//最大数5000 5000*4int main(){    int m,i,j,t,s,arr[MAX];    memset(arr,0,sizeof(arr));//初始    arr[0]=1;//注意一定要设为1    scanf("%d",&m);    for(i=2;i<=m;i++)//一层循环求阶乘     {        t=0;//t清0        for(j=0;j<MAX;j++)        {            s=arr[j]*i+t;//存储计算结果             arr[j]=s%10;//最低位存进数组前面             t=s/10;//计算进位         }    }     for(i=MAX-1;i>=0;i--)    {        if(arr[i])      break;    } //把0筛选掉     for(j=i;j>=0;j--)    {        printf("%d",arr[j]);    }//倒着输出     printf("\n");    return 0;} 

学习感想:
大数的阶乘:用数组存放数据
5000!=1* 2 * …*5000
5000!的位数=㏒10(1* 2* 3* 4* 5* ……*5000)+1
eg:㏒10(100)=2 位数=2+1
数组大小可以用最大数的位数*最大数(个人理解)

循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 关机后强制刷机怎么办 红米手机开机画面怎么办 红米note1无法清理数据怎么办 红米2a密码忘记怎么办 线刷也不成功该怎么办 红米2开不了机怎么办 魅族无限重启怎么办 坚果pro无法双清怎么办 usb外置网卡网速慢怎么办? 无线路由器被改密码怎么办 电脑打不开flv格式的视频怎么办 电脑打不开pdf格式的文件怎么办 pdf格式在电脑上打不开怎么办 zip压缩的时候空间不足怎么办 电子发票填抬头错了怎么办 发票写错一个字怎么办 普票税率开错了怎么办 税率开错为17了怎么办 电子发票抬头错了怎么办 发票抬头错了一个字怎么办 5月税率开错了怎么办 如果发票是假的怎么办 发票收款人名字写错了怎么办 医院发票名字写错了怎么办 购买方发票联丢失怎么办 市中区超市办理发票怎么办 发票购买薄丢了怎么办 发票领用簿丢了怎么办 摩托车证扣12分怎么办 初中孩孑想扩展单词量怎么办 恒安保险倒闭了怎么办 小麦收割机卸粮筒总是转怎么办 非牛顿体结块了怎么办 非牛顿流体硬了怎么办 玩具枪子弹打到眼睛怎么办 杭州磨床7130噪音大怎么办 步兵太苦还有一年怎么办 检法事业编怎么办最新 河北省事业单位改企编制怎么办 梦飞去虎牙锐雯怎么办 蚂蚁借呗还款钱没到账怎么办