1. 程式人生 > >設計一個演算法,計算出n階乘中尾部零的個數

設計一個演算法,計算出n階乘中尾部零的個數

考慮到只要有5,或者因子為5的數,就可以產生0的尾部。假如1*2*3*4*...*250,那麼250/5=50可以知道,有50個為5的倍數,但是裡面有多少個為25的倍數,125的倍數...,

50/5=10,可知25的倍數有10個,10/5=2,可知125的倍數有兩個,以此類推,程式碼如下:

class Solution {
 public:
    // param n : description of n
    // return: description of return 
    long long trailingZeros(long long n) {
        long long num = 0;
    while(n)
    {
        num += n / 5;
        n = n / 5;
    }
    
    return num;
    }
};


相關推薦

設計一個演算法計算n尾部個數

考慮到只要有5,或者因子為5的數,就可以產生0的尾部。假如1*2*3*4*...*250,那麼250/5=50可以知道,有50個為5的倍數,但是裡面有多少個為25的倍數,125的倍數..., 50/5=10,可知25的倍數有10個,10/5=2,可知125的倍數有兩個,以此

【Python】設計一個演算法計算n尾部個數

1.常見的思路:先求N的階乘,再計算零的個數。 (但是,時間消耗太大)    def trailingZeros( n):         S = 1         for i in range(1,n+1):             S = S * i        

演算法計算n尾部個數

思路: 觀察1-20階乘的結果,觀察尾數為0的分佈情況 發現有一個5就會出現一個0 其中5!(有一個5),10!(有兩個5) 5!=120(一個0) 10!=3628800(兩個0) #include <stdio.h> long trailingZeros(long n) {

lintcode入門級-計算n尾部個數

題目地址:https://www.lintcode.com/problem/trailing-zeros/description 我想法很簡單,算出數值大小,直接對尾部進行除法取餘找0: (function () { var trailingZeros = function

n尾部個數(JAVA)

描述 設計一個演算法,計算出n階乘中尾部零的個數 樣例 11! = 39916800,因此應該返回 2 挑戰 O(logN)的時間複雜度 所有可能造成尾部0的只有10的倍數,5的倍數,也就是求階乘中擁有的5的個數。 例如 11 = 1,2,3,4

設計一個演算法只含素因子235 的第 n 小的數

醜數為值只包含因子 2、 3、 5 的數,14不是醜數因為包含因子7. /*int min(int a,int b){ if(a>b){ return b; }else{

程式基本演算法習題解析 用分治法設計一個演算法偽造硬幣

題目:  一個裝有16枚硬幣的袋子,16枚硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕。現有一臺可用來比較兩組硬幣重量的儀器,請使用分治法設計一個演算法,可以找出那枚偽造的硬幣。 首先建立一個有16個int資料型別的陣列,模擬16枚硬幣,真幣賦為1,假幣賦為0。根據二分搜

程式設計師面試金典: 9.4樹與圖 4.2給定有向圖設計一個演算法兩個節點之間是否存在一條路徑。

#include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; /* 問題:給定有向圖,設計一個

設計一個演算法刪除遞增有序連結串列值大於mink且小於maxk的所有元素(mink和maxk是給定的兩個引數其值可以和表的元素相同也可以不同)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

計算n尾部0的個數

題目描述: 設計一個演算法,計算出n階乘中尾部零的個數。 eg. 11! = 39916800 輸入11,結果應該返回2。 分析: n的階乘可以分解為k和10的m次冪的乘積,結果resul

給定陣列a[0:n-1]試設計一個演算法在最壞情況下用[3n/2 -2 ] 次比較找a[0:n-1]元素的最大值和最小值;教材2-15

給定陣列a[0:n-1]試設計一個演算法,在最壞情況下用[3n/2 -2 ] 次比較找出a[0:n-1]中元素的最大值和最小值; 解:要求對於陣列用小於【3n/2-2】的比較次數找到兩個最值 可以用陣列第一個元素來初始化max,min 然後遍歷陣列,分別和max,min比較,一遍就可以找

設計一個演算法通過一趟遍歷確定長度為n的單鏈表值最大的結點。

語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin

已知兩個連結串列A和B分別表示兩個集合其元素遞增排列。請設計一個演算法用於求A與B的交集並存放在A連結串列

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數、判斷一個整數是否是迴文數

<!-- 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9

設計一個演算法將連結串列所有結點的連結串列方向“原地”逆轉即要求僅利用原表的儲存空間換句話說要求演算法的空間複雜度為O(1)。

語言:C++ #include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(Li

設計一個演算法一個十進位制的數轉化為二進位制

#include<iostream.h> const int StackSize=10; class SeqStack {     public:        SeqStack(){

程式基本演算法習題解析 用分治法設計一個演算法統計輸入的非空字串給定字元的個數

首先附上一般思路的程式碼(不用分治法,將輸入字串中的字元從前往後依次比對): // Chapter7_1.cpp : Defines the entry point for the application. // 用分治法設計一個演算法,統計輸入的非空字串中給定字元的個數 #include "

前端演算法:給定一個整數陣列和一個目標值陣列中和為目標值的兩個數、判斷一個整數是否是迴文數

<!-- 給定一個整數陣列和一個目標值,找出陣列中和為目標值的兩個數。 你可以假設每個輸入只對應一種答案,且同樣的元素不能被重複利用。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[

已知線性表元素以值遞增有序排列並以單鏈表作為儲存結構設計一個演算法刪除表值相同的多餘元素

/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構 * 設計一個演算法,刪除表中值相同的多餘元素 * 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間 */ #include<stdio.h> #inclu

【資料結構 C描述】設計一個演算法用於檢測給定的字串是否為對稱串。

【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。 所謂對稱串,就是字串從左往右讀和從右往左讀的序列一樣。 例如: abccba是對稱串。 abcabc不是對稱串。 //main.cpp #include <iostream> #include