不要被阶乘吓倒

public class JieCheng {
    /**
     *  a 的阶乘最后有几个0
     *  积为0 只有一种情况,那就是2*5才会为10,这样就产生了一个0
     *  因此就是求 a的阶乘里面的因子2的个数与因子5的个数,然后取两者
     *  中小的那个,因为5的频率比2要小,所以只求5的就可以了
     * @param a
     */
    public static void execute(int a){
	int count = 0;
	for(int i=2;i<=a;i++){
	    int j = i;
	    while(j%5==0){count++;j/=5;}
	}
	System.out.println(count);
    }
    /**
     * n的阶乘中 因子k 的个数有个公式:z = n/k+n/k2+n/k3+...+n/kx 
     * @param a
     */
    public static void execute2(int a){
	int count = 0;
	while(a!=0){
	    count+= a/5;
	    a=a/5;			// 多次边除就相当于平方了
	}
	System.out.println(count);
    }
    /*
     * 求 n 的阶乘二进制表示最低位的1的位置,
     * 想知道n!二进制表示的最低位1的位置,就得知道最后有几个0,什么时候后面是0?
     * 只有当 k/2==0 时,二进制最后会补0,所以就是求 n!中因子2的个数
     */
    public static void lowestOne(int n){
	int count =0;
	while(n!=0){
	    n>>=1;
	    count+=n;
	}
	count++;
	System.out.println(count);
    }
    public static void main(String args[]){
	int n = 60;
	execute(60);
	execute2(60);
	lowestOne(3);
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值