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

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

Q - 高精度(大数)n次方

Problems involving the computation of exact values of very large magnitude and precision are common....
  • whhhzs
  • whhhzs
  • 2018年01月23日 22:38
  • 27

大数的n次方

把题分成三部分: 1、把数字逆序存放,以方便乘法时从后一位乘起的规则,记下小数点的位置,在相乘时去掉小数点,在结果输出时再添加小数点; 2、用循环得数的幂次方(注意把每次相乘要放的数组清零); ...
  • zhaorongxia
  • zhaorongxia
  • 2012年04月07日 00:39
  • 1307

大数运算(高精度) (六)—— 大数求幂

/** 大数(高精度)求幂 **/ //输入两个数字 m(可以带小数点),n,求m的n次方 #include #include #include char multiply[1000]; v...
  • GooMaple
  • GooMaple
  • 2012年07月30日 16:21
  • 3401

高精度模板(大数)

http://blog.csdn.net/xujinsmile/article/details/7848680
  • sungaochao
  • sungaochao
  • 2014年12月20日 23:48
  • 222

打印1到最大的n位数(大数问题)

/****************************************************** 题目:输入数字n,按顺序打印出从1最大的n位十进制。比如输 入3,则打印出1,2,3,4...
  • walkerkalr
  • walkerkalr
  • 2014年03月06日 14:51
  • 1673

大数阶乘和一个数的n次幂(c语言)

对于一个数的阶乘,一般情况下(不是竞赛),用
  • u013240038
  • u013240038
  • 2014年10月26日 09:26
  • 1788

【C语言代码】大数N的阶乘!

/************************************************ 在做小数N阶乘时,使用递归算法,而当N数变 大时,就不好算了因此谢了这个程序,来计算 大数N阶乘,做...
  • jsxhtzwj
  • jsxhtzwj
  • 2014年03月17日 22:06
  • 798

POJ2109 高精度(含大数开方)+二分

1 高精度(含大数开方)+二分 一个技巧和三点注意: 技巧:假设k^n=p;(k的n次方),那么p的位数/n得到的是k的位数!例如:n=7,p=4357186184021382204544,p的位数为...
  • a272846945
  • a272846945
  • 2016年07月18日 21:36
  • 1237

算法 - RSA大数分解

Reading pager… Updated later
  • Seal_Shile
  • Seal_Shile
  • 2016年10月21日 17:19
  • 1273

n个大数加法(高精度)

 #include #include #include using namespace std; int dx(char a[]) {     int tmp,len;   ...
  • qingshui23
  • qingshui23
  • 2015年04月24日 22:00
  • 514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【N!】【大数】
举报原因:
原因补充:

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