http://acm.hdu.edu.cn/showproblem.php?pid=1018 正确的解法为: #include <iostream> using namespace std; int main() { int t,n,ca,cb,digit; double num; if(cin>>t) { for(ca=0;ca<t;ca++) { cin>>n; digit=1;num=1; for(cb=2;cb<=n;cb++) { num*=cb; if(num<10) { continue;} if(num<100) { digit+=1;num/=10;continue;} if(num<1000) { digit+=2;num/=100;continue;} if(num<10000) { digit+=3;num/=1000;continue;} if(num<100000) { digit+=4;num/=10000;continue;} if(num<1000000) { digit+=5;num/=100000;continue;} if(num<10000000) { digit+=6;num/=1000000;continue;} if(num<100000000) { digit+=7;num/=10000000;continue;} } cout<<digit<<endl; } } return 0; } 错误的解法为: #include <iostream> #include <vector> using namespace std; /************************************************************************/ /* 主要是阶乘溢出,即便是unsigned long long 类型,20的阶乘照样溢出 */ /************************************************************************/ unsigned long long factorial(int n); int main() { int N; cin>>N; for (int i=0; i<N; i++) { int m; cin>>m; long result = factorial(m); printf("%ld/n", result); int sum = 0; while (result != 0) { result /= 10; sum++; } printf("%d/n", sum); } } unsigned long long factorial(int n) { unsigned long long sum = 1; for (int i=1; i<=n; i++) { sum *= i; } return sum; }