您的位置:首页 > 其它

不要被阶乘吓倒

2012-10-20 19:21 330 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: