目录
水仙花数
题目概述:
求出0~n之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如;153=1^3+5^3+3^3,则153是一个“水仙花数“。)
代码实现:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i <= n ; i++) {
int count = 1;
int tmp = i;
int sum = 0;
//判断i是否为水仙花数
//1. 求判断数字的位数
while(tmp/10 != 0)
{
count++;
tmp = tmp/10;
}
//2. 计算每一位的次方和
tmp = i;
while(tmp != 0)
{
sum += Math.pow(tmp%10, count);
tmp = tmp/10;
}
//3. 判断
if(sum == i)
System.out.println(i);
}
}
求二进制1的个数
题目概述:
求一个整数,在内存当中存储时,二进制1的个数。
代码实现:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int count = 0;
for (int i = 0; i < 32; i++) {
if(((n>>>i) & 1) == 1) {
count++;
}
}
System.out.println(count);
}
第一种方式的缺陷:不是什么数据,循环都要执行32次。比如数字7:0000 0111 右移3次之后,就是0了。所以进行优化:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int count = 0;
while (n != 0) {//如果移动的过程当中是0了,就结束循环
if((n & 1) != 0) {
count++;
}
n = n >>> 1;
}
System.out.println(count);
}
第3种方式:
采用相邻的两个数据进行按位与运算
第一次循环:n=7 n=n&(n-1) = 7 & 6 = 6
第二次循环:n=6 n=n&(n-1)= 6 & 5= 4
第三次循环:n=4 n=n&(n-1)=4 & 3= 0
此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int count = 0;
while (n != 0) {
n = n & (n-1);
count++;
}
System.out.println(count);
}