大数据阶乘(The factorial of large data)

时间:2023-03-09 06:30:59
大数据阶乘(The factorial of large data)
题目描述 Description
阶乘是计算中的基础运算,虽然规则简单,但是位数太多了,也难免会出错。现在的问题是:给定任意位数(long long类型)的一个数,求它的阶乘,请给出正确结果。为提高速度,保证给定运算的结果均为正整数。
 输入输出格式 Input/output
输入格式:
一行:一个long long类型的数
输出格式:
一个正整数,表示计算的结果(不可以有前导0)
 输入输出样例 Sample input/output
样例测试点#1
输入样例#1:
3
输出样例#1:

6

输入样例#2:
4
输出样例#2:

24

思路:这题的数据量很大,long long类型的,如果直接计算是不可取的,必须用高精度算法。
这里可以分为几个函数来计算:
①乘法函数:专题里面会细细地讲的
倒序输出函数:专题里面会细细地讲的
③阶乘函数:要把增序的数转换成数组,再传入乘法函数进行计算
代码如下:
 #include <stdio.h>
#include <string.h>
/*=============================================================*/
/////////乘法函数////////////// void mul(int a[],int b[])//正整数的高精度运算 a*b ---> c
{
int i=,j=,x=,lenc=;
int c[];
memset(c,,sizeof(c));//清零
for(i=;i<=a[];i++)
{
x=;//表示进位
for(j=;j<=b[];j++)
{
c[i+j-]=c[i+j-]+a[i]*b[j]+x;
x=c[i+j-]/;
c[i+j-]=c[i+j-]%;
}
c[i+b[]]=x;//表示进位(向c的更高位进位)
}
lenc=a[]+b[];
while(c[lenc]==&&lenc>) lenc--;
c[]=lenc;
for(i=;i<=lenc;i++)//重新存入数组a
{
a[i]=c[i];
}
}
/*==============================================================*/
/////////倒序输出函数//////////////
void output(int c[])//倒序输出
{
int i;
for(i=c[];i>=;i--)
{
printf("%d",c[i]);
}
printf("\n");
}
/*==============================================================*/
/////////计算阶乘函数///////////
void kee(long long n)
{
int h,p=,r=,q=;//一堆for用的东西
int i,k=;//k记录b数组的有多少号元素
int b[]={};//依次增加乘数
int a[]={,};//当前被乘数
for(i=;i<=n;i++)
{
h=;
p=i;
while(p>)//把阶乘数i转换成数组
{
b[h]=p%;
p=p/;
k++;
}
b[]=k;
mul(a,b);//传入乘法函数
}
output(a);//输出结果
}
/*==============================================================*/
/////////主函数///////////
int main()
{
long long n;
scanf("%I64d",&n);
if(n==||n==)//如果是1、2的话,输出即可
{
printf("%I64d\n",n);
}
else if(n<)
{
printf("Wrong Answer!\n");
}
else kee(n);//传入阶乘函数
return ;
}