作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
点击免费注册和我一起刷题吧
文章目录
题目一
题目二
题目三
题目四
题目五
题目六
点击题目链接即可跳转答题
题目一
CD145 整数的二进制数表达中有多少个1
求一个整数,在内存当中存储时,二进制1的个数。
方法一:一个整型的数字共32个比特位,每个比特位如何判断是否为1?只需让这一位和1进行按位与即可
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
int count=0;
for (int i = 1; i <=32 ; i++) {
if(((n>>i)&1)==1){
count++;
}
}
System.out.println("二进制中1的个数:"+count);
}
}
这种方法的缺陷在于:每个数都要按位与完32位,比如1只有第一位是1,后面31个0没有必要比较
优化:
import java.util.Scanner;
public class Main{
public static void main1(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);
}
}
方法二:
采用相邻的两个数据进行按位与运算
第一次循环: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);
}
题目二
ZJ17 水仙花数
求出0~n之间的所有“水仙花数”并输出。
(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=1^3+5^3+3^3,则153是一个“水仙花数“。)
解题思路:
1. 求取该数是几位数
2. 获取该数中每个位置上的数据,并对其进行立方求和
3. 对该数中每个位上的数据立方求和完成后,在检测其结果是否与该数相等即可,
相等:则为水仙花数,否则:不是
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
int i=0;
for (i = 0; i <=n; i++) {
int count=1;
int tmp=i;
int sum=0;
while(tmp/10!=0){
//求数的位数
count++;
tmp=tmp/10;
}
//计算每一位的次方和
tmp=i;
while(tmp!=0){
sum+=Math.pow(tmp%10,count);
tmp=tmp/10;
}
//判断
if(sum==i){
System.out.println(i);
}
}
}
}
题目三
和我一起学java
输出一个整数的每一位,如:123的每一位是3,2,1
解题思路:
本题主要考虑,如何获取一个数字的每一位:
123 % 10 = 3
123/10=12 12%10=2
12/10=1 1%10= 1
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
while (n != 0) {
System.out.println(n % 10);
n /= 10;
}
}
}
题目四
模拟登陆
编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
字符串怎么比较相同?使用方法equals
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = 3;
while (count != 0) {
System.out.println("请输入你的密码:");
String password = scanner.nextLine();
if(password.equals("123")) {
System.out.println("登录成功!");
break;
}else {
count--;
System.out.println("你还有"+count+" 次机会!");
}
}
}
题目五
二进制序列
获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
解题思路:
检测num中某一位是0还是1的方式:
1. 将num向右移动i位
2. 将移完位之后的结果与1按位与,如果:
结果是0,则第i个比特位是0
结果是非0,则第i个比特位是1
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//0000 0010
for (int i = 31; i >= 1 ; i-=2) {
System.out.print(((n>>>i) & 1) + " " );
}
System.out.println();
for (int i = 30; i >= 0 ; i-=2) {
System.out.print(((n>>>i) & 1) + " " );
}
}
}
题目六
计算分数的值
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。
解题思路:
1. 从上述表达式可以分析出
a. 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i, 注意此处不能使用1,否则结果全部为0
然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
然后将所有的项相加即可
public class test {
public static void main(String[] args) {
double sum = 0;
int flg = 1;
for (int i = 1; i <= 100; i++) {
sum += 1.0/i * flg;
flg = -flg;
}
System.out.println(sum);
}
}
题目六
输出乘法口诀表
public class test {
public static void main(String[] args) {
for (int i = 1; i <= 9 ; i++) {
for (int j = 1; j <= i; j++) {
//注意这里的拼接,不要是换行
System.out.print(j+"*"+i+"="+i*j+" ");
}
System.out.println();
}
}
}
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!