[蓝桥杯][基础练习VIP]阶乘计算
题目描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入
输入包含一个正整数n,n< =1000。
输出
输出n!的准确值。
样例输入
10
样例输出
3628800
无捷径,全靠板子
// 阶乘计算 --- 相当于就是高精度乘法的变形
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int num1[500005];
int num2[10];
int num3[500005];
int n;
void BT(int k)
{
memset(num2,0,sizeof(num2));
int t =0;
while(k)
{
num2[++t] = (k%10);
k/=10;
}
num2[0] = t; //保存个数
}
//乘法板子 0位都采取保存位数的方式
void mul()
{
memset(num3,0,sizeof(num3));
for(int i = 1;i<=num1[0];i++)
for(int j = 1;j<=num2[0];j++)
{
int u = num1[i]*num2[j];
num3[i+j-1] +=(u);
num3[i+j] +=(num3[i+j-1]/10);
num3[i+j-1]%=10;
}
int k = num1[0]+num2[0];
while(num3[k]==0&&k>0) k--;
num3[0] = k;
}
int main()
{
memset(num1,0,sizeof(num1));
cin>>n;
num1[1] = 1; //表示第一个个位是0;
num1[0] = 1; //表示只有一位;
for(int i =2;i<=n;i++)
{
BT(i); //变换i
mul(); //乘法
memset(num1,0,sizeof(num1));
for(int i = 0;i<=num3[0];i++)
{
num1[i] = num3[i];
}
}
for(int i = num1[0];i>=1;i--)
cout<<num1[i];
return 0;
}