计算N的阶乘(大数)
发布时间:2020-12-14 03:38:04 所属栏目:大数据 来源:网络整理
导读:计算n的阶乘,结果为大数。 大数的话,普通类型肯定存不下,所以一定要用其他方式来存储。 废话不多说,直接上代码。 #include stdio.h#include stdlib.h#include math.h#define DIGIT 5//DIGIT为数组每单元存放数的位数 #define MAX (int)pow(10,DIGIT) //1
计算n的阶乘,结果为大数。 大数的话,普通类型肯定存不下,所以一定要用其他方式来存储。 废话不多说,直接上代码。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define DIGIT 5 //DIGIT为数组每单元存放数的位数 #define MAX (int)pow(10,DIGIT) //10000 #define PI 3.1415926 void printFactorial(long *a,int n); void printFactorial2(int *a,int n); int main() { int n=5; //计算n的阶乘有多少位,赋值合适的数组大小 double t = (n*log(n) - n + 0.5*log(2*n*PI))/log(10); int x=(int)t+1; long *a=(long *)malloc(x*sizeof(long)); long *p=a; //对开辟的空间进行初始化 for(p=a;x--;p++){ *p=0; } *a=1; printFactorial(a,n); return 0; } //用数组求n的阶乘 void printFactorial(long *a,int n) { if(n<0){ printf("-1"); return; } if(n==0 || n==1){ printf("1"); return; } long i,carry,len=1; do{ for(carry=0,i=0;i<len;i++) { //从第1位第n个数开始乘 a[i]=a[i]*n+carry; carry=a[i]/MAX; a[i]%=MAX; //如果是最高位进位的话,结果长度加1、继续循环一次 !(i==len-1 && carry>0) ? : len++; } }while(--n); printf("%ld",a[len-1]); for(i=len-2;i>=0;i--)//每数组单元输出DIGIT位数字 printf("%0*ld",DIGIT,a[i]); } void printFactorial2(int a[],int n)//简单版本 { int i,j=0; int jinwei; int len=1; while(j++!=n) { jinwei=0; for(i=0;i<len;i++) { a[i]=a[i]*j+jinwei; jinwei=a[i]/10000; a[i]=a[i]%10000; if(i==len-1 && jinwei>0) len++; } } printf("%d",a[len-1]); for(i=len-2;i>=0;i--) printf("%04d",a[i]); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |