二叉树的层序遍历 N!结尾0的个数

来源:互联网 发布:看图猜字网络世界 编辑:程序博客网 时间:2024/05/21 09:00

二叉树的层序遍历

void _LevelOrder(Node *pRoot)    {        Node *pCur = pRoot;        queue<Node *> q;        q.push(pCur);        while (!q.empty())        {            Node *pTop = q.front();            cout << pTop->_data << " ";            q.pop();            if (pTop->_pLeft)                q.push(pTop->_pLeft);            if (pTop->_pRight)                q.push(pTop->_pRight);        }    }

N!结尾0的个数

 首先考虑,如果N的阶乘为K和10的M次方的乘积,那么N!末尾就有M的0。如果将N的阶乘分解后,那么     N的阶乘可以分解为: 2的X次方,3的Y次方,5的Z次方,.....的成绩。由于10 = 2 * 5,所以M只能和X和Z有关,每一对25相乘就可以得到一个10,于是M = MIN(X,Z),不难看出X大于Z,因为被2整除的频率比被5整除的频率高的多。所以可以把公式简化为M=Z.     由上面的分析可以看出,只要计算出Z的值,就可以得到N!末尾0的个数     就是要计算1-n的因式分解中5的指数。然后求和。     如25的阶乘有60,25*24==600,有两个0,#include<iostream>using namespace std;int getNum(int n){    int num = 0;    int i, j;    for (i = 1; i <= n; i++)    {        j = i;        while (j % 5 == 0)        {            num++;            j /= 5;        }    }    return num;}int getNum2(int n){    int ret = 0;    while (n)    {        ret += n / 5;        n /= 5;    }}int main(){    int n;    while (cin >> n)    {        cout << getNum(n) << endl;    }    return 0;}