朴素方法求解会超时,所以采用斯特林近似方法求解; n!近似等于sqrt(2*PI*n)*(n/e)^n。然后取对数后上取整。
// codingEx.cpp : Defines the entry point for the console application.
// author: momogary1204
//#include "stdafx.h"
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
const double PI = 3.14159;
const double e = exp(1);
double cal(const double& number){
return 0.5*log10(2 * PI*number) + number*log10(number / e);
}
//const int MAX_LEN = 50;
//const int MAX_CASE = 100;
int main()
{
double number = 0;
int testcase = 0;
//double sum = 0;
vector<int> result;
cin >> testcase;
while (testcase--){
cin >> number;
if (number == 0 || number == 1){
result.push_back(1);
continue;
}
//朴素方法
//sum = 0;
//for (double i = 1; i <= number; i++){
// sum += log10(i);
//}
result.push_back(ceil(cal(number)));//斯特林近似求解
}
for (int i = 0; i < result.size(); i++){
cout << result[i] << endl;
}
//cin >> number;
return 0;
}