/*
问题描述
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*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 <vector>
using namespace std;
// 高精度乘法
vector<int> multiply(vector<int> &a, int b) {
vector<int> c;
int t = 0; // 进位
for (int i = 0; i < a.size() || t; i++) {
/*
这里的 i < a.size() || t 是一个条件表达式,
用于控制循环的终止条件。这个循环是计算高精度乘法的核心部分,从低位到高位依次计算出每一位的值。
具体来说,当 i 小于数组 a 的长度时,说明还有元素需要遍历,这时候需要继续循环。
而当进位变量 t 不为0时,说明还有进位需要处理,也需要继续循环。只有当 i 大于等于数组 a 的长度并且进位变量 t 为0时,才可以退出循环。
这样设计的目的是保证循环能够正确地计算出所有位数的结果,
同时避免无限循环的情况。因为进位变量 t 最多只能是1,所以当 i 大于等于数组 a 的长度时,t 必须为0才能终止循环,否则就会进入死循环。
*/
if (i < a.size()) t += a[i] * b; // 乘法操作
c.push_back(t % 10); // 取余数
t /= 10; // 取进位
}
return c; // 返回高精度乘积
}
// 输出高精度数
void print(vector<int> &a) {
for (int i = a.size() - 1; i >= 0; i--) {
cout << a[i]; // 逆序输出
}
cout << endl; // 换行
}
int main() {
int n;
cin >> n; // 读入n
vector<int> a;
a.push_back(1); // 初始化a为1
for (int i = 2; i <= n; i++) {
a = multiply(a, i); // a = a * i,更新a的值
}
print(a);
return 0;
}
/*
* 问题描述
输入一个正整数n,输出n!的值。
其中n!=1*2*3*…*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
*/
package cn.meowrain;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
BigInteger res = new BigInteger("1");
for(int i = 1;i<=n;i++){
res = res.multiply(BigInteger.valueOf(i));
}
System.out.println(res);
}
}