用高精度方法计算n! ,并显示n!(阶乘)的值。

时间:2021-08-15 02:04:49

【问题描述】 
对于任意给定的n值(n为整数,且1<=n<=100),计算并显示n!(阶乘)的值。 
【样例】
输入:n= 10
输出: 3628800
又输入:n= 20
输出: 2432902008176640000

使用整型数组来存储大数类的每一位,并模拟手工乘法的全过程。。

#include "stdio.h"
#include "stdlib.h"

const unsigned int MAX = 10000; //整型数组的最大长度
const long long WIDTHMAX = 1000000000; //整型数组val[MAX]的元素上限
const unsigned int WIDTH = 9; //输出整型数组val[MAX]的元素时的格式宽度,即整型数组val[MAX]的元素的最多位数

typedef struct node
{
long long val[MAX]; //用来存储高精度整数
unsigned int size; //整型数组的实际长度
}BigInt;

void PrintBigInt(const BigInt & a); //输出大数类
BigInt MulBigInt(const BigInt & a, const BigInt & b); //大数类相乘
BigInt FacBigInt(unsigned int n); //大数类求阶乘


void PrintBigInt(const BigInt & a)
{
unsigned w;
int i;
printf("%lld",a.val[a.size-1]);
for (i=a.size-2; i>=0; i--)
{
w = WIDTHMAX / 10;
while (w > 0)
{
if (a.val[i] >= w)
break;
printf("0");
w /= 10;
}
printf("%lld",a.val[i]);
}
printf("\n");
}

/*
函数名称:MulBigInt
函数功能:高精度整数乘法
输入参数:const BigInt & a:用整型数组表示的高精度整数被乘数
const BigInt & b:用整型数组表示的高精度整数乘数
输出参数:BigInt:返回用整型数组表示的高精度整数乘积
*/
BigInt MulBigInt(const BigInt & a, const BigInt & b)
{
int i,j;
BigInt c;
if (a.size == 1 && a.val[0] == 0)
return a;
if (b.size == 1 && b.val[0] == 0)
return b;

for (i=0; i<MAX; i++) //全部赋初值为0
c.val[i] = 0;
for ( i=0, j=0; i<b.size; i++)
{
for (j=0; j<a.size; j++)
{
c.val[i+j] += a.val[j] * b.val[i];
c.val[i+j+1] += c.val[i+j] / WIDTHMAX;
c.val[i+j] %= WIDTHMAX;
}
c.size = i + j;
if (c.val[c.size] != 0) //最高位有进位
c.size++;
}
return c;
}


/*
函数名称:FacBigInt
函数功能:高精度整数阶乘
输入参数:unsigned int n:正整数
输出参数:BigInt:返回用整型数组表示的高精度整数阶乘
*/
BigInt FacBigInt(unsigned int n)
{
unsigned long long i;
BigInt s, c;
c.size = s.size = 1;
s.val[0] = 1;
for (i=2; i<=n; i++)
{
c.val[0] = i;
s = MulBigInt(s, c);
}
return s;
}

int main(void)
{
BigInt a;
unsigned int n;
printf("请输入n值:");
scanf("%u",&n);
a=FacBigInt(n);
printf("%u的阶乘为:\n",n);
PrintBigInt(a);
system("pause");
return 0;
}

方法二:
 

#include<iostream>
using namespace std;

#define MAX 1000

int main(void)
{
int n;
while(scanf("%d",&n) == 1 && n >= 0)
{
int i,j;
int a[MAX]; //存数运算结果
int p , add; //p存储当前结果的位数,add为进位
a[1] = 1;
p = 1;
for(i = 2 ; i <= n ; ++i) //循环与2,3,4.....n相乘
{
for(j = 1 , add = 0 ; j <= p ; ++j) //让a[]的每位与i相乘
{
a[j] = a[j] * i + add;
add = a[j] / 10;
a[j] = a[j] % 10;
}
while(add > 0) //如果h不为0
{
a[j] = add % 10;
add = add / 10;
++j;
}
p = j - 1; //将当前的位数赋给p
}
for(i = p ; i >= 2 ; --i) //a[]数组的前面是低位,后面高位
{
printf("%d",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}