首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 筆記:階乘尾數零的個數

     編輯:關於C++

題目描述

給定一個整數 n,回傳 n!(n 的階乘)結果末尾連續 0 的個數。要求演算法時間複雜度為對數級 O(log n)。

題目分析

暴力法先算出 n! 再數尾數 0,但 n 稍大就會溢位,不可行。關鍵在於質因數分解:n! = 2^x * 3^y * 5^z * ...。每個 10 由一個 2 和一個 5 相乘產生,尾數 0 的個數等於 min(x, z)。證明可知階乘中 2 的指數一定大於 5 的指數,所以 min(x, z) = z。問題轉化為求 n! 中質因數 5 的總指數。

計算公式:z = n/5 + n/25 + n/125 + ...(整數除法),直到商為 0。這正是對數時間複雜度的來源。

示例代碼 (C++)

#include <iostream>
using namespace std;

class Solution {
public:
    int trailingZeroes(int n) {
        int result = 0;
        while (n) {
            result += n / 5;
            n /= 5;
        }
        return result;
    }
};

小結

代碼極短,但從題目要求推導到簡單運算需要數學直覺。理解質因數分解中 2 與 5 的關係是關鍵,體現了演算法設計中「化繁為簡」的思想。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved