解析:
想要完成这道题,首先要知道求n!有多少个0的计算方法。
最直观的方法就是计算出n!,而后迭代除以10,直到余数不为零为止。可是这样作显然会超时,而且对于较大数的阶乘,咱们没法计算出它的值。
所以咱们从分析n!的公式入手:
不难发现,一个数的阶乘想要末尾含有0,就要同时包括2的倍数和5的倍数(由于2*5=10)
又由于2的倍数比5的倍数多(由于是阶乘,含有5的倍数则必定含有2的倍数,反之则不必定),所以求n!末尾含有多少个0,实则就是求以下公式:
看到贴吧吧友问这个问题,忽然意识到没写明白,这里是补充:
补充示例:
对于一个数,若是它是5^n的倍数,那么它能够拆分为n个5相乘,而这些5会和其余偶数结合,所以结尾会还会多0
故有代码:ios
int FindZero(int n) { int cnt = 0; while (n) { cnt += n / 5; n /= 5; } return cnt; }
由于随着n的增大,F(n)愈来愈大,知足单调关系,所以使用二分查找算法的效果显然更好,算法的时间复杂度为O(logN)
代码:web
#include<iostream> #include <algorithm> #include<cstdio> #include<string> #include<Windows.h> #include<cstring> #define MAXN 50000 using namespace std; int FindZero(int n) { int cnt = 0; while (n) { cnt += n / 5; n /= 5; } return cnt; } int main() { int n, aa; int mid, st, en; int ans = MAXN; cin >> n; st = 1;en = MAXN; while (st <= en) { mid = (st + en) >> 1; aa = FindZero(mid); if (aa == n) { ans = mid; break; } else if (aa < n) st = mid + 1; else en = mid - 1; } if (aa == MAXN) cout << "No Solution!" << endl; else { ans -= ans % 5; cout << ans << endl; } system("pause"); return 0; }