问题一解法:
    我们知道求N的阶乘结果末尾0的个数也就是说我们在从1做到N的乘法的时候里面产生了多少个10,
我们可以这样分解,也就是将从0到N的数分解成因式,再将这些因式相乘,那么里面有多少个10呢?
其实我们只要算里面有多少个5就可以了?
    因为在这些分解后的因子中,能产生10的可只有5和2相乘了,由于2的个数是大于5的个数的,因此
我们只要算5的个数就可以了。那么这个题目就是算这些从1到N的数字分解成因子后,这些因子里面
5的个数。

  Python代码
  1. def factorialnumberofzero(v_value):
  2. countoffive = 0
  3. for num in range(1, v_value + 1):
  4. value = num
  5. while ((value % 2) == 0) and value:
  6. value /= 2
  7. countoffive += 1
  8. print countoffive
  9. return countoffive




问题二的解法:
    那么我们如何思考这个问题呢?
    其实很简单,我们只要算它的结果是2的多少幂的倍数就行了,假如结果是8,那么8是2的3次幂,也就是说8的最后一个1在倒数第4位。
那么如何算N!是2的多少次幂呢?
    当然我们只要算在乘的时候有从少个2相乘就可以了,还是和第一题那样分解因子相乘啊,看因子里总的2的个数。但是有没有简单的方法?
    当然有
    我们看下10! ,那么10!到底有多少个2呢?
        呵呵,首先我们将10/2=5 也就是从10到1中有5个偶数
        10、8、6、4、2
        有多少个偶数肯定有多少个2啦,然后我们将它们除以2
        5、4、3、2、1
        这5个数里面又有5/2=2个偶数。
        4、2
        我们将4、2除以2,得到
        2、1
        里面有一个2/1=1个偶数。
        2
        2/2=1  就没有了。

看算法:
    
  1. def factorialpositionoflastone(v_value):
  2. positioncount = 0
  3. while v_value:
  4. v_value >>=1
  5. positioncount += v_value
  6. print positioncount
  7. return positioncount

     


    
    

N的阶乘末尾0的个数和其二进制表示中最后位1的位置的更多相关文章

  1. Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes

    题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...

  2. Algorithm --> 求阶乘末尾0的个数

    求阶乘末尾0的个数 (1)给定一个整数N,那么N的阶乘N!末尾有多少个0?比如:N=10,N!=3628800,N!的末尾有2个0. (2)求N!的二进制表示中最低位为1的位置. 第一题 考虑哪些数相 ...

  3. LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1138 题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0:如果没有输出 ...

  4. [LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数

    Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...

  5. [LeetCode] 172. Factorial Trailing Zeroes 求阶乘末尾零的个数

    Given an integer n, return the number of trailing zeroes in n!. Example 1: Input: 3 Output: 0 Explan ...

  6. 求N的阶乘N!中末尾0的个数

    求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...

  7. POJ 1401:Factorial 求一个数阶乘的末尾0的个数

    Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 9349 Descri ...

  8. 求一个数的阶乘在 m 进制下末尾 0 的个数

    题意 : 求一个数 n 的阶层在 m 进制下末尾 0 的个数 思路分析 : 如果是 10 进制地话我们是很容易知道怎么做的,数一下其对 5 约数地个数即可,但是换成 m 进制的话就需要先将 m 分解质 ...

  9. LightOj 1090 - Trailing Zeroes (II)---求末尾0的个数

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1090 题意:给你四个数 n, r, p, q 求C(n, r) * p^q的结果中末尾 ...

随机推荐

  1. Linux下暴力破解工具Hydra详解

    一.简介 Number one of the biggest security holes are passwords, as every password security study shows. ...

  2. 命令行子shell 括号 ()

    子shell 控制变量 ansible-direc:~ # (export hello=world;echo $hello)worldansible-direc:~ # echo $hello ans ...

  3. 下载pdf_不同操作系统,无法正常下载(兼容性问题)

    [功能点]:下载pdf文件 [问题描述]:window上传附件,linux无法下载 [根本原因]:window中路径分割符为"\",linux中路径分割符为"/" ...

  4. Knockout.js是什么?

    从本节开始介绍关于KnockoutJs相关的内容,本节主要介绍knockoutjs一些重要特性与优点,以及它与Jquery等框架库之间的区别. 1.Knockout.js是什么? Knockout是一 ...

  5. 定时往oracle插入数据

    1创建存储过程 create or replace procedure job_proc isbegininsert into yy (yid) values (sysdate);end; 2创建jo ...

  6. MFC 框架技术简单研讨

    引用:http://www.cnblogs.com/chinazhangjie/archive/2011/09/20/2181986.html 正文: 第一讲 Win32 App  和  MFC Fr ...

  7. 你不要用战术上的勤奋掩盖战略上的懒惰by雷军

    这个问题很有趣. 战略.战术.勤奋.懒惰,我们拆开来看吧,虽然我觉得其实分析一个人说话是为什么是很没有意义的事情.我们要先了解一下,公司的组织中,谁是指定战略的,谁是指定战术的.公司战略和战术意味着什 ...

  8. 机器学习实战-边学边读python代码(3)

    程序清单2-3 归一化特征值: def autoNorm(dataSet): /* >>> barray([[ 1., 2., 3.], [ 2., 3., 4.], [ 10., ...

  9. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    问题分析:错误提示中的“ordinal not in range(128)”,意思是,字符不在128范围内,即说明不是普通的ASCII字符,超出处理能力了. import sys print u'系统 ...

  10. Android LayoutParams简介

    LayoutParams是子控件控制自己在父控件中布局的一个类. 不同布局都有相对的LayoutParams,最简单的LinearLayout.LayoutParams类可以设置布局的宽高. 我在写一 ...