题目如下:
Input
Input consists of several lines of integer numbers. The first line contains an integer n, which is the number of cases to be tested, followed by n lines, one integer 1 <= m <= 10^7 on each line.
Output
The output contains the number of digits in the factorial of the integers appearing in the input.
然后写好了代码...样例过了耶....然后没想那么多...submit....结果....Runtime Error....... 郁闷,然后一直调数组长度....好了....没有RE....发现TLE....然后自己用10^7进行测试...等了三四秒才能显示出来.....结果想了半小时....没思路....然后就开始百度....最后找到一些思路是使用一些数学公式来求的....
具体思路有两种。
第一种是(第一类斯特林公式?)
用这个方法的话在POJ的话,会超时,数据有点变态....应该有接近10^7的数据....
第二种是(第二类斯特林公式?)
用这种公式的话...样例过了....POJ过不了(WA)....HDOJ过了....然后纠结了....然后继续研究为什么POJ过不了,发现...对于这个公式...
如果用
len = (0.5*log(2.0*PI*k) + k*log((double)k) - k) / log((double)10) + 1;这样的代码...对于k=1的情况,len为0.....自己也用计算器算了一下...发现..
len(k = 1) = (0.5*log(2.0*PI*k) + k*log((double)k) - k) / log((double)10) = -0.03520....
以下是提交代码....其中注释部分是第一种思路的,没注释就是第二种思路的...
#include<iostream> #include<cmath> #define PI 3.1415926 using namespace std; int main() { long k; int n; double len; cin >> n; while(n--) { cin >> k; /*len = 1; while(k>0) { len += log10((double)k); k--; }*/ if(k != 1) len = (0.5*log(2.0*PI*k) + k*log((double)k) - k) / log((double)10) + 1; else len = 1; cout << (long)len << endl; } return 0; }