博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求N!中末尾有多少个0
阅读量:4072 次
发布时间:2019-05-25

本文共 630 字,大约阅读时间需要 2 分钟。

http://blog.csdn.net/cow__sky/article/details/36190587

分析:

对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z)。在实际中x是远远大于z的,所以我们只要求出z的值即可。

  根据公式
  z = N/5 + N/5^2 + N/5^3+...+N/5^k
  这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5...。
  比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个;同样,125在N/5中贡献一个,在N/5^2中贡献一个,在N/5^3中再贡献一个,一共是3个。

代码:

[java]
  1. public int getContinueZero(int num){  
  2.     int countOfZero = 0;  
  3.     while(num>0)  
  4.     {  
  5.         countOfZero+=num/5;  
  6.         num/=5;  
  7.     }  
  8.     return countOfZero;  
  9. }  
用同样思路解下一题:

求N!的二进制中最低位1的位置。实际上就是判断二进制末尾有多少个0,然后位置=0的个数+1;

判断二进制末尾0的个数可以用右移操作来完成。而二进制每次右移一位相当于十进制除以2,直到除不够为止。所以归根结底就是要求N!质因数分解的2的个数x。这个操作与上面求5的个数如出一辙。

你可能感兴趣的文章
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>
服务器普通用户(非管理员账户)在自己目录下安装TensorFlow
查看>>
星环后台研发实习面经
查看>>