目录
1.求二进制1的个数
求一个整数,在内存当中存储时,二进制1的个数。
思路:把该整数和1按位与,如果得到的数为1,二进制1的个数+1,再右移该整数,继续按位与1,直到移动到第一位符号位为止,一共要右移31次。
例如:求整数9,再内存当中储存时二进制的个数
代码实现
public static void main(String[] args) {
int a= 9;
int count =0;
for (int i = 0; i < 32; i++) {
if(((a>>i)&1)==1){
count++;
}
}
System.out.println(count);
}
a右移i次,再按位与1,循环进行了32次,但是只右移了31次,因为第一次i=0
优化1
我们可以不可以对这个代码进行优化呢?我们发现不管给的整数是多少,改代码都会右移31次,然后得到最终答案,这样做显然效率是不高的。
我们可以每次把a右移一位之后判断a是否等于0.如果等于0就退出循环。
public static void main(String[] args) {
int a = 9;
int count = 0;
while(a != 0){
if((a & 1)==1){
count++;
}
a=a>>>1;//无符号右移
}
System.out.println(count);
}
这里使用无符号右移原因是,如果a是一个负数,普通右移就会补一个1,这样永远数不完。
优化2
我们还可以对这个代码进行怎样的优化呢?
public static void main(String[] args) { int a = 9; int count = 0; while(a!=0){ a=a&(a-1); count++; } System.out.println(count); }
2.计算分数的值
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
public static void main(String[] args) { double sum = 0.0;//用浮点数存储小数 int flag = 1; for (int i = 1; i <=100 ; i++) { sum = sum + (flag)*1.0/i;//写成1.0是因为我们需要小数点后面的数字 flag = -flag; } System.out.println(sum); }
3. 水花仙数
求出0~n之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=1^3+5^3+3^3,则153是一个“水仙花数“。)
public static void main(String[] args) { for (int i = 100; i <= 999; i++) { int sum = 0; int tmp = i;//把i的值赋给tmp保证i的值不变,否则会死循环 while(tmp!=0){ sum = sum+(int)Math.pow(tmp%10,3);//math.pow的返回值是double类型,需要强转成int类型 tmp /= 10; } if(sum == i){ System.out.println(i); } } }
拓展
根据这个规律我们能否写一个代码,求得1位数到7位数的所有水花仙数呢?
public static void main(String[] args) { for (int i = 1; i <=9999999 ; i++) { int count = 0; int sum = 0; int tmp = 0; tmp = i; while(tmp!=0){ tmp /= 10; count++;//得到i是几位数 } tmp = i; while(tmp!=0){ sum = sum + (int)Math.pow(tmp%10,count); tmp /= 10; } if(sum == i){ System.out.print(i+" "); } } }
4. 打印X图形
题目描述:
思路:
public static void main(String[] agrs){ Scanner scan = new Scanner(System.in); while(scan.hasNextInt()){ //多行输入 int n = scan.nextInt(); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(i==j || i+j==n-1){ System.out.print("*"); } else{ System.out.print(" "); } } System.out.println(); } } }
5.输出乘法口诀表
输出n*n的乘法口诀表,n由用户输入
public static void main(String[] args) { Scanner scan =new Scanner(System.in); int n = scan.nextInt(); for (int i = 1; i <=n ; i++) { for (int j = 1; j <= i; j++) { System.out.print(j+"*"+i+"="+i*j+" "); } System.out.println(); } }
6.输出一个整数的每一位
输出一个整数的每一位,如:1234的每一位是4,3,2,1
public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); while(n!=0){ System.out.println(n%10); n /= 10; } }
7.模拟登陆
编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
public static void main(String[] args) { Scanner scan = new Scanner(System.in); int count = 3; while(count!=0) { System.out.println("请输入密码,你还有" + count + "次机会"); String pass = scan.nextLine(); if (pass.equals("shiyanan123")) {//判断输入的字符串是否正确 System.out.println("密码正确,登录成功"); break; } else { System.out.println("密码错误,登录失败"); } count--; } }
8.二进制序列
获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); System.out.print("奇数位: "); for (int i = 31; i >=1 ; i=i-2) { System.out.print(((n>>i) & 1)+" "); } System.out.println(); System.out.print("偶数位: "); for (int j = 30; j>=0 ; j=j-2) { System.out.print(((n>>j) & 1)+" "); } }