
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:C语言从入门到进阶
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
文章目录
点击题目链接即可跳转答题
求一个整数,在内存当中存储时,二进制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);
- }
求出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);
- }
- }
- }
- }
输出一个整数的每一位,如: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();
- }
- }
- }

“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!
