1 #include <iostream> 2 using namespace std; 3 // O(nlogn),思路:找0的个数,就是找10的个数,就是2*5的个数,2比5多,所以就是找5的个数,首先找到5的倍数,再判断这些数里面有多少个5 4 int numOfZeros1(int n) 5 { 6 //i从1开始,当n为26时,那么i就是1,2,3,4,5 7 //j就是5*i,所以对于的j就是5,10,15,20,25,第二个while循环找的就是j中有多少个5,像数字25,就有2个5 8 //count表示的5的个数,即0的个数 9 int i, j, count; 10 i = 1; 11 count = 0; 12 while (5 * i <= n) 13 { 14 j = 5 * i; 15 while (j % 5 == 0) 16 { 17 count++; 18 j = j / 5; 19 } 20 i++; 21 } 22 return count; 23 } 24 // o(logn),从时间复杂度上来说,优化的多。思路:n=26时,0的个数就是[26/25]+[26/5]=1+5=6 25 int numOfZeros2(int n) 26 { 27 int i, count; 28 i = 0; 29 count = 0; 30 while (n / 5) 31 { 32 count += n / 5; 33 n /= 5; 34 } 35 return count; 36 } 37 int main() 38 { 39 int n; 40 n = 125; 41 //test 42 cout<<numOfZeros1(n)<<endl; 43 cout<<numOfZeros1(n)<<endl; 44 system("pause"); 45 return 0; 46 }
原文:http://www.cnblogs.com/chuanlong/p/3703784.html