【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;
}

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

汇编语言实现大数乘2的N次幂

  • 2013年07月29日 16:26
  • 1KB
  • 下载

杭电1042—— N!(大数乘法的应用!)

N! Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! ...

O(N)的时间寻找第K大数——Python

最近在学Python,从基础的语法学起,但是代码这玩意,还是动手为佳,就从实现几个简单的算法开始吧。 算法很简单,就是快排的思想,快排的时间复杂度为O(NlogN),这里主要是不需要对切割的两个序列...

WV.29-大数阶乘算法9-求N!的高精度算法

求N!的高精度算法   本文是张一飞2001年写的论文,原文可从http://oibh.kuye.cn/download/thesis/thesis2001_zhangyifei.zip处...
  • MIKASA3
  • MIKASA3
  • 2015年01月30日 22:09
  • 734

打印1到最大的n位数:大数问题,全排列实现

大数,全排列

【编程题目】Pq.7--打印1到最大的n位数(关于大数问题的探讨)

一、题目描述 输入数字n,按顺序打印从1到最大的n位数。比如输入3,则依次打印1、2、3一直到最大的3位数999....

HDOJ 1042 N! (大数)

Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N ...

hdu 1042 N! (java大数)

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

面试题12:打印1到最大的n位数-大数问题-递归实现多层循环

#include #include #include #include #include #include #include using namespace std; void p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【N!】【大数】
举报原因:
原因补充:

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