之前做的银联题目有一道题目就是1000的阶乘尾部有多少个0,记得这样的题目之前是做过的,但是当时就是时间太紧了没想起来,今天又遇到这个题目,索性查查看看是怎么算的,然后程序计算一下,加深理解,对于这样的题目网上也有很多的解法,核心的思想就是找规律看问题的本质是什么的,因为不可能让你求一下n!的阶乘然后自己去数一下一共末尾有多少个0,会溢出的。

思路:

如果想要尾部出现0必然离不开10的出现,而10的出现可以简化为2*5的结果,而在数字的分解中2的出现频数远高于5的出现频数,在这里的规律就是直接找n的因子分解中5的个数即可。

要找到n!的阶乘中尾部1的下标的思路同上,只需要寻找n中因数2的个数即可,因为这里返回的下标是从末尾开始数的所以在返回的结果中加1取反即可,因为Python中的末尾下标是从-1开始的。

有了这样的规律做起来就比较简单了,下面是具体的实现了:

#!usr/bin/env python
#encoding:utf-8'''
__Author__:沂水寒城
功能:给定一个整数N,求N!末尾有多少个0,求N!的二进制中最低位1的位置
'''def count_0_nums1(n):'''求N!末尾有多少个0'''num=ntmp=0while num:tmp+=num/5num/=5print '{0}的阶乘末尾有{1}个0'.format(n, tmp)return tmpdef count_0_nums2(n):'''求N!末尾有多少个0'''res=0for i in range(5,n+1,5):index=i while index%5==0:res+=1index/=5print '{0}的阶乘末尾有{1}个0'.format(n, res)def find_tail_1_position(n):'''求N!的二进制中最低位1的位置'''temp=nres=0while temp:temp>>=1res+=temp print '{0}的二进制中最低位1的位置在{1}'.format(n, -(res+1))if __name__ == '__main__':num_list=[4,10,6,12,100,1000]for one in num_list:count_0_nums1(one)print '----------------------------------------'for one in num_list:count_0_nums2(one)print '------------------------------------------'for one in num_list:find_tail_1_position(one)

结果如下:

4的阶乘末尾有0个0
10的阶乘末尾有2个0
6的阶乘末尾有1个0
12的阶乘末尾有2个0
100的阶乘末尾有24个0
1000的阶乘末尾有249个0
----------------------------------------
4的阶乘末尾有0个0
10的阶乘末尾有2个0
6的阶乘末尾有1个0
12的阶乘末尾有2个0
100的阶乘末尾有24个0
1000的阶乘末尾有249个0
------------------------------------------
4的二进制中最低位1的位置在-4
10的二进制中最低位1的位置在-9
6的二进制中最低位1的位置在-5
12的二进制中最低位1的位置在-11
100的二进制中最低位1的位置在-98
1000的二进制中最低位1的位置在-995
[Finished in 0.3s]

顺便说一下,考试遇到的那个题目问1000!末尾有 多少个0,它给的选项都是四位数的,我选的是2499,貌似所有选项尾部都是9,应该是题目出错了吧,其实当时就怀疑不可能会有几千个0的,差点想写个小程序算一下,毕竟服务器的话还是ok的。

python求解给定一个整数N,求N!末尾有多少个0,求N!的二进制中最低位1的位置相关推荐

  1. 求100000000!末尾有多少个0

    **@求100000000!末尾有多少个0 /求100000000!末尾有多少个0 两个数相乘怎么能得到0呢? 只能是25 因为2的个数要远远的多于5 所以说只需要数5的个数即可 */ #includ ...

  2. python步骤解析 给定一个整数数组和目标值_给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9...

    python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...

  3. 给定一个整数序列,求中位数

    问题描述: 给定一个整数序列,求中位数.如果序列个数为奇数,中位数为升序的中间位置,如果是偶数,这位升序的中间两个数的平均值. 输入: 输入包含多组测试数据,每一组第一行为n(n<104)表示这 ...

  4. (python)给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的两个整数。

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nu ...

  5. 给定一个整数N,那么N的阶乘N!末尾有多少个零呢?

    题目:给定一个整数N,那么N的阶乘N!末尾有多少个零呢? 末尾有几个零?如果我们从哪些数相乘可以的出10,这个角度来解决这个问题,这就会变成简单.对质因数进行分解由于10=2*5,即每一对2和5就可以 ...

  6. 698. 划分为k个相等的子集:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。

    题目描述 给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 示例 1: 输入: nums = [4, 3, 2, 3, 5, 2, 1], k ...

  7. 算法思想记录:给定一个整数数组 nums 和一个目标值 target

    1.我的目的 记录此题的思路 ----- 灵活运用hashmap/dict提升效率 2.题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数, ...

  8. JS实现 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    题目:(JS实现) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 四种方法如下: 方法一:暴力破解法,和值匹配 //暴力 ...

  9. java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    标题:java,给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 一.示例 二.题解 方法一,暴力法:使用双重for循环,每 ...

  10. 【八皇后】给定一个大小为 n 的正方形国际象棋棋盘,求有多少种方式可以放置 n 个皇后并使得她们互不攻击,即每一行、列、左斜、右斜最多只有一个皇后。

    给定一个大小为 n 的正方形国际象棋棋盘,求有多少种方式可以放置 n 个皇后并使得她们互不攻击,即每一行.列.左斜.右斜最多只有一个皇后. 输入是一个整数 n,输出是一个整数 m,表示所有的棋盘表示方 ...

最新文章

  1. 开启Windows7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP)
  2. MySQL 可重复读,差点背上一个 P0 事故!
  3. 千寻的计算机字符,转义字符变量与赋值
  4. 数据库_数据库系统概论
  5. 吴恩达机器学习week2
  6. Selenium处理Select控件
  7. TypeScript系列教程--初探TypeScript
  8. Thinkphp if标签不支持3层以上嵌套
  9. 互不相识的人在什么情况下会给你点赞呢?
  10. JSP EL表达式中11个隐藏对象file:///D:/SoftwareFile/qq file/MobileFile/34090016310074682(1).png
  11. 树莓派csi摄像头和usb摄像头_树莓派usb摄像头用fswebcam 设置
  12. linux终端清除命令,ubuntu清除命令行记录
  13. 2:jdbc 连接步骤及基本用法
  14. HTML签名生成图片+可加水印
  15. 最小二乘法拟合二次曲线 C语言
  16. 丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应
  17. mos管的rc吸收电路计算_RC吸收电路
  18. 华为5G的秘密原来掌握在一个土耳其人的手中?!
  19. 【tsinsen A1490】osu!(乔明达) 矩阵+线段树
  20. 0711 练习 百分制成绩记入与十分制成绩记入方式转换

热门文章

  1. 动态控制C4C UI元素的显示和隐藏
  2. 《Linux/UNIX OpenLDAP实战指南》——1.4 OpenLDAP目录条目概述
  3. DataSource接口 Connection pooling(连接池
  4. Win2008使用无线网络
  5. 国士工作室 企业级Android软件开发和实战培训专家
  6. SecureCRT安装(5)
  7. 第2章 JSP数据交互(一)
  8. [Codeforces 920E]Connected Components?
  9. 20172324《程序设计与数据结构》第一周学习总结
  10. 解决 ThinkPad x270 安装 ubuntu 14.04 后的网络问题