目录
求一个整数,在内存当中存储时,二进制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); }
计算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);
- }
求出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+" "); } } }
题目描述:
思路:
public static void main(String[] agrs){ Scanner scan = new Scanner(System.in); while(scan.hasNextInt()){ //多行输入 int n = scan.nextInt(); for(int i=0;i for(int j=0;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)+" "); } }
- 相关阅读:
【WFA】【WIFI6】HE-5.31.2_6G Fail
大数据集群中部署Hive
命令模式
MyBatis-Plus学习笔记
【vue3】Suspense组件和动态引入defineAsyncComponent的搭配使用
扩大图片手势的点击范围的方法
MyBatis的各种查询功能
不一样的纯H5C3动画爱心
两款开源的工作流引擎快速开发框架源码
d3dcompiler43.dll是什么?d3dcompiler43.dll缺失怎么解决?
- 原文地址:https://blog.csdn.net/qq_62712350/article/details/126063812