阶乘:
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”。");
}
}