Java关于阶乘和二进制“1”的个数的算法题

阶乘:

package com.jiale.algorithmDay01;


/**
 * 求一个整数0到20的阶乘
 * @author jiale
 *
 */
public class Factorial {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Factorial() {}
public Factorial(int num) {
this.num = num;
}
public long factorial(){
long result = 1;
for (int i = 1; i <= num; i++) {
result *= i;
}
return result;
}
public static long factorial(int num){
long result = 1;
for (int i = 1; i <= num; i++) {
result *= i;
}
return result;
}
}

求一个整数的阶乘(Factorial)末尾“0”的个数:(用while循环和取模运算符%来统计0的个数)

package com.jiale.algorithmDay01;


import java.util.Scanner;


public class Demo01 {


public static void main(String[] args) {
int num = 21;
while (num > 20) {
// TODO 自动生成的方法存根
System.out.println("请输入(0到20以内)要想算的阶乘数:");
Scanner s = new Scanner(System.in);
num = s.nextInt();
}
long result = Factorial.factorial(num);
System.out.println(num+"!="+result);
int zero = 0;
while (result % 10 == 0) {
zero ++;
result /= 10;
}
System.out.println("它的末尾有"+zero+"个零。");
}

}

运算结果:请输入(0到20以内)要想算的阶乘数:
20
20!=2432902008176640000
它的末尾有4个零。



求二进制表示中最低位1的位置:(同样取模运算)

package com.jiale.algorithmDay01;


import java.util.Scanner;


public class Demo02 {


public static void main(String[] args) {
int num = 21;
while (num > 20) {
// TODO 自动生成的方法存根
System.out.println("请输入(0到20以内)要想算的阶乘数:");
Scanner s = new Scanner(System.in);
num = s.nextInt();
}
long result;
result = Factorial.factorial(num);
System.out.println(num+"!="+result);
System.out.println("它的二进制表示为:"+Long.toBinaryString(result));
int count = 1;
while (result % 2 == 0) {
count ++;
result /= 2;
}
System.out.println("这个数的二进制数是从右到左第"+count+"位为1的。");
}

}

请输入(0到20以内)要想算的阶乘数:
20
20!=2432902008176640000
它的二进制表示为:10000111000011011001110111110010000010101101000000000000000000
这个数的二进制数是从右到左第19位为1的。



二进制中1的个数:(效率比较高的是位运算的操作,直到将操作数右位移到0为止,这样一个字节(8bit),这样最多循环8次。最简单的是下面定义一个256个元素的int数组,这样只要寻找要求得byte数据对应的数组下标就知道了1的个数,时间复杂度为O(1)。)

package com.jiale.algorithmDay01;


public class Demo03 {


public static void main(String[] args) {
// TODO 自动生成的方法存根
byte a = 56;
int b = a;
// int num = 0;
// while (a != 0) {
// num += a & 0x01;
// a >>= 1;
// }
int[] countTable = new int[]{
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 
       1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
       1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
       1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
       2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 
       3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
       3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 
       4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
};
int num = countTable[a];
System.out.println("这个数的二进制数是:"+Integer.toBinaryString(b)+"\n"+"有"+num+"个“1”。");
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值