题目描述
给定一个正整数 nn,求出 n!n! 的值。
输入描述
输入一个正整数 nn,n<=1000n<=1000。
输出描述
输出 n!n! 。
输入输出样例
示例
输入
10
输出
3628800
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
解析:
- 整体算法背景
- 当计算一个数的阶乘结果时,如果将阶乘结果以数组形式存储(例如用于处理非常大的阶乘结果,因为普通数据类型可能无法存储),这里的操作通常是对数组中每个数位进行处理的一部分。
- 关于在阶乘计算中的作用
- 在计算阶乘时,假设我们要计算n!,并且将结果以数组形式存储(每个数组元素存储结果的一位数字)。
- 通常会有一个外层循环来处理从到的数相乘过程。当计算n*(n-1)*……*1时,这个i可能代表正在相乘的其中一个数。
- 例如,当计算5!(5*4*3*2*1)时,在某一时刻:
- 对于数组存储结果的数位,a[j]表示结果中的某一位数字。最初可能从最低位开始计算。
- i可能是正在与之前的部分结果相乘的数。比如在计算5*4*3的过程中,当处理到5*4=20之后,再乘以3时,i=3。此时存储着之前计算结果(20的某一位数字),a[j]*i就是将之前的部分结果的这一位数字乘以当前要乘的数i,再加上之前计算产生的进位carry,得到新的这一位数字(可能还需要后续处理进位)。
所以,在阶乘计算的这个代码片段中,i通常代表正在参与乘法运算的其中一个数,用于逐步构建阶乘结果的每一位数字。
#include <bits/stdc++.h>
using namespace std;
#define N 10010
int a[N]={0};
int main()
{
// 请在此输入您的代码
int n;
cin>>n;
a[0]=1;
for (int i=1;i<=n;i++)
{
int carry=0;
for(int j=0;j<N;j++)
{
a[j]=a[j]*i+carry;
carry=a[j]/10;
a[j]%=10;
}
}
int last;
for (int i=N-1;i>=0;i--)
{
if(a[i]!=0)
{
last=i;
break;
}
}
for (int i=last;i>=0;i--)
{
cout<<a[i];
}
return 0;
}
原题链接: 1.阶乘计算 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/1515/learning/?page=1&first_category_id=1&problem_id=1515
蓝桥 lanqiaoOJ 1515通过