【N!】【大数】

原创 2013年12月03日 11:13:15

对于求大整数的阶乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律。

for exmaple:123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;

如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0]。

#include<stdio.h>

int main(){
    int n,j,i,t,p;
    int result[16000];
    while(scanf("%d",&n)!=EOF){
        t=p=0;
        result[0]=1;                //t记录result中所存数的个数
        for(j=1; j<=n; j++){                 //n!=1*2*3*4...*n;
            for(i=0; i<=t; i++){
                result[i]=result[i]*j+p;    //如果sum>99999不成立,则不需进位,进位为0
                p=result[i]/100000;          //进位
                result[i]%=100000;        //数组sum中每位存5位数字
            }
            if(p){         //t在最高位有进位的情况下++,最高位存进位,并让进位为0
                t++;
                result[t]=p;
                p=0;
            }            // 如果进位不为0, 则下一次乘的时候将加上该进位,显然不合理
        }
        printf("%d",result[t]);//先把最高位输出,因为最高位没有前导0
        for(i=t-1; i>=0; i--){
            printf("d",result[i]);//s[i]不足5位,说明需补0
        }
        //也说明result[i]在对100000取余的 时候去掉了前导0,所以这里要加上
        printf("\n");
    }
    return 0;
}

//某位大牛的代码,自己小小改了一下。一时找不到出处了,有空一定给补~

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

剑指offer 求一个数的n次方,不考虑大数问题

一定得注意取值,当指数小于0,指数大于0,指数等于0时 如果指数和底数都是0时怎么办,还有浮点数的比较#include #define ESP 0.0000001 typedef enum boo...

c++对一元n次方程近似解求法(不涉及大数)

二分法求解

HDU-4359-DP+C(n, m)大数求

比赛的时候一直在敲这道题。一开题就盯住这个名字了。有人说他说是 treeDP 不一定真的是 treeDP。 总有时候别人会给你很诚恳的忠告。却只因自己陷得太深无法自拔。关键是自己不想出去。 跑题了...

模n下大数幂乘的两个算法的基本运作原理

写在前面: 这是我第一篇CSDN博客,除了跟各位前辈交流学习,我同样想我跟那些没学过计算机的家人朋友分享我所学到的东西(至少让他们知道我是学什么的,真的不是修电脑的)。由于水平所限,肯定无法把这些东西...

hdu 1042 N!(大数阶乘,转化为100000这样的比较大的进制)

N!Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi...

HDU 1042求N! (大数)

阶乘递归代码:(教材) C++代码   #include  int f(int n);  void main()  {    printf(...

sdut2605山东省赛第四届/( A^f(1)+A^f(2)+ ... + A^f(n) )% P/存储中间值/将大数打表并用两个数组组合表示

1)如果用快速幂求A^X,那么整道题的最坏时间复杂度为:O(n)=(40*(10^6)*log(n)=O(10^9),超时。仔细看这道题的特点,如果用快速幂计算单个A^X还好,但是当n足够大,我们需要...

递归大总结之打印大数1-n

递归 #include using namespace std; void PrintfNumber(char num[]) { bool isBegin0 = true; int nlengt...
  • gjggj
  • gjggj
  • 2017-03-08 21:21
  • 253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)