`
zhongkem
  • 浏览: 152469 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

不要被阶乘吓倒

阅读更多

来源:编程之美 2.2

题目:1.给定一个整数N,求N!末尾有多少个0

2.求N!的二进制表示中最低位1的位置

对于第一个问题,书中也给出了两种解答方法,第二种是最好的,想明白为什么这样做后就很简单了。

/**
 * 1.给定一个整数N,求N!末尾有多少个0 2.求N!的二进制表示中最低位1的位置
 */
public class Factorial2_2 {
	
	public static void main(String[] args){
		int num=100;
		System.out.println(zeroCount1(num));
		System.out.println(zeroCount2(num));
	}

	// 解法一,有多少个0,其实可以转化成求因式分解后5的指数是多少
	public static int zeroCount1(int n) {
		int res = 0;
		int i, j;
		for (i = 1; i <= n; i++) {
			j = i;
			while (j % 5 == 0) {
				res++;
				j /= 5;
			}
		}
		return res;
	}
	
	//解法二,连续的k个数有且仅有1个数可以被k整除,如2,3,4,5,6肯定只有一个5可以被5带除
	//如n=100时,可以把100,99,98....1五个五个分成一组,能分多少组就说明有多个数能被5整除
	//接着计算有多少个数能被25,125...整除
	//这就是书中给出的公式来源:Z = [N/5] +[N/5^2] +[N/5^3] + …
	//(不用担心这会是一个无穷的运算,因为总存在一个K,使得5^K > N,[N/5^K]=0。)
	public static int zeroCount2(int n) {
		int res = 0;
		while(n>0){
			res+=n/5;
			n/=5;
		}
		return res;
	}

}

 

第二个问题的解法和第一个问题差不多,只不过是求2的质因数个数

//第二个问题实际上可以转化成求n!中含有质因数2的个数,最后加上1即可,解法和求5的是一致的
	public static int lowestOne1(int n){
		int res=0;
		while(n>0){			
			n>>=1;
			res+=n;			
		}
		return res+1;
	}
	//N!含有质因数2的个数,还等于N减去N的二进制表示中1的数目
	//这个思路比较难想~~
	public static int lowestOne2(int n){
		return n-count3(n)+1;
	}
	//整数二进制表示中1的个数,只需循环1的个数次即可
	//每次循环都把最低位的1去掉了
	public static int count3(int  a){
		int count=0;
		while(a>0){			
			count++;
			a&=(a-1);//通过&运算把最低位的1变成0
		}
		return count;
	}

 

扩展问题:给定整数n,判断它是否为2的方幂

这个问题比较简单,只要是2的方幂的数,二进制表示都只有一个1,前面讲过n&(n-1)会把最低位的1变成0,因此只需要判断n&(n-1)是否为0即可:

	//判断整数n是否为2的方幂
	public static boolean isMiTwo(int n){
		if(n>0&&((n&(n-1))==0))return true;
		return false;
	}

 

 

分享到:
评论

相关推荐

    千万不要被阶乘吓倒

    阶乘(Factorial)是个很有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题: 1、 给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3 628 800,N!的末尾有两个0。2、求N!的...

    计算大数的阶乘方法,内有详细解释

    在计算机科学领域,大数阶乘的计算是一项挑战性任务,因为普通的整数运算库往往无法处理超过...在本压缩包中的“不要被阶乘吓倒.pdf”文件,很可能提供了更深入的解释和实例,建议进一步阅读以获取更多细节和实践指导。

    java阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘

    java阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘

    阶乘计算 大数阶乘 大整数阶乘 用数组计算阶乘

    阶乘 阶乘计算 大数阶乘 大整数阶乘 用数组计算阶乘

    n的阶乘问题--阶乘位数--阶乘末尾0的个数

    在编程领域,阶乘是一个常见的数学概念,尤其在算法和计算数学中经常被用到。本文将深入探讨“n的阶乘问题”,包括阶乘的定义、计算阶乘位数的方法以及如何确定阶乘末尾零的个数。 首先,阶乘是指一个正整数n与小于...

    阶乘算法 阶乘问题 C# 小程序

    阶乘算法是计算一个正整数n的所有小于等于n的正整数的乘积的数学概念,表示为n!。在计算机科学中,阶乘算法经常用于解决各种问题,如组合数学、排列组合以及概率计算等领域。C#是一种常用的编程语言,它提供了多种...

    JAVA求N的阶乘

    阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,...

    巧算100万阶乘

    ### 巧算100万阶乘:C++实现与分析 #### 背景介绍 阶乘是一个常见的数学概念,表示所有小于等于该数的正整数的乘积。例如,5的阶乘(记作5!)是1 * 2 * 3 * 4 * 5 = 120。对于较大的数,如100万的阶乘(1000000!)...

    c语言 10的阶乘

    本主题聚焦于使用C语言计算10的阶乘,这是一个基础但重要的算法问题,对于学习编程的初学者来说具有很高的实践价值。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常用“!”表示。例如...

    用C语言计算20的阶乘

    C语言是一种通用的编程语言,具有高效性和灵活性,被广泛应用于系统开发、嵌入式系统等领域。它支持函数、数组、指针等特性,能够直接访问内存地址,因此非常适合进行高性能计算任务,包括数学计算如阶乘的求解。 #...

    VB 递归求阶乘

    本篇将详细讲解如何使用VB实现递归来求解阶乘。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常用n!表示。例如,5的阶乘(5!)是5 × 4 × 3 × 2 × 1 = 120。递归求阶乘就是利用函数...

    1到n的阶乘求和

    阶乘求和是一个在计算机科学和数学中常见的问题,它涉及到序列的计算和求和。在本问题中,我们关注的是从1到n的所有整数的阶乘的总和。阶乘是一个数与小于等于它的所有正整数的乘积,表示为n!。例如,5! = 5 × 4 ×...

    n的阶乘末尾有多少个0_n的阶乘末尾的0_

    在编程领域,我们经常遇到计算一个大数的阶乘的问题,比如找到整数n的阶乘(n!)。然而,当n变得非常大时,直接计算阶乘可能会导致整数溢出,因为n!的增长速度非常快。为了解决这个问题,我们可以关注阶乘末尾的零个...

    求阶乘-c#编写的求阶乘的程序

    在编程领域,阶乘是一个常见的数学概念,通常用于计算组合数和概率问题。在这个主题中,我们将深入探讨如何使用C#编程语言实现阶乘计算。C#是一种面向对象的、类型安全的、现代的编程语言,由微软开发,广泛应用于...

    大数阶乘 双向链表

    在计算机科学中,处理大数阶乘是一项挑战性的任务,因为普通的整数类型无法存储非常大的数值。本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好...

    阶乘及阶乘和的两种编法

    阶乘和阶乘是数学中的两个基本概念,尤其在组合数学和计算机科学中有着广泛的应用。本篇文章将详细探讨这两个概念及其在编程中的实现方法。 首先,我们需要理解什么是阶乘。阶乘是一个正整数n与小于等于它的所有正...

    java中的1到20的阶乘

    ### Java中的1到20的阶乘 在Java编程语言中,实现1到20的阶乘是一个典型的编程练习,可以帮助初学者理解循环结构、变量声明以及简单的数学运算。本篇文章将详细介绍如何在Java中计算1到20的阶乘,并深入探讨其中...

    leetcode中国-BeautyOfProgramming:本书的代码

    leetcode中国 Contents Chapter ...不要被阶乘吓倒 位运算的一些应用(如果将数看成是某种进制数位幂的连加) 2.3 寻找发帖的“水王” 妙用抵消法 有一个地方存疑:对于N-1个元素,需要多少次遍历才能

Global site tag (gtag.js) - Google Analytics