第十四届蓝桥杯集训——if——配套用法示例

简介: 第十四届蓝桥杯集训——if——配套用法示例

第十四届蓝桥杯集训——if——配套用法示例



 

输入一个数n,判断n是否是2的指数。

n的取值范围(0=>n<= )

题目看着很简单,其实在比较小的数上还是挺容易做的,但是依然要使用循环进行处理。

把这个数多次除以2,

如果可以整除,

是2的指数倍,

如果不可以,就不是,

但是循环我们还没有学习呢,不能用循环处理,而且利用这种方式根本无法判断要循环多少次,根据取值范围可以直接套31次循环。每次都循环这么多次,复杂度这就不低了。所以我们尽量用一次判断来解决它。

但是今天我们不使用循环,我们就使用一个【&】符号来判断这个n是否是2的指数。

推理:

有一个数2,这个数是否是2的指数。

2进行二进制处理,得出:【10】,如果【10】&【01】正好等于【00】,我们知道,如果是2的指数那么一定会是100000……的方式。故而我们有,如果二进制的这个数-1与n这个数进行&的位运算结果一定是00000,……,所有我们就可以用一个表达式来计算这个n是否是2的指数了。

方法1

接下来我们上代码:

举例数字1:2二进制:10,有: 10&(10-1)=10&01=00

举例数字2:8二进制:1000,有1000&(1000-1)=1000&0111=0000

后面的数字都是一个逻辑,计算完成后都是0000。

package com.item.action;
import java.util.Scanner;
public class Main {
  public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.close();
    /**
     * 举例数字1:2二进制:10,有: 10&(10-1)=10&01=00
     * 举例数字2:8二进制:1000,有1000&(1000-1)=1000&0111=0000
     * 后面的数字都是一个逻辑,计算完成后都是0000。
     */
    if ((n & (n - 1)) == 0) {
      System.out.println(true);
    } else {
      System.out.println(false);
    }
  }
}

输入测试1024,输出结果true。

方法2

我们利用2的31次幂来直接计算,这种方法的复杂度也是O(1)

package com.item.action;
import java.util.Scanner;
public class Main {
  public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.close();
    /**
     * 方法2:利用范围2的31次幂=2,147,483,648,
     * 注:由于int正值是从0开始计算故而无法正常显示2147483648
     * 我们需要使用l来表示一下这个数才能正常计算
     */
    if(2147483648l%n==0) {
      System.out.println(true);
    }else {
      System.out.println(false);
    }
  }
}

输入测试1024,输出结果true。

其实我们学会第二种方法后,无论是int范围还是long范围的所有数我们就都会判断了。

其它指数幂

例如:判断一个数是否是7的指数。

先计算7在int范围内的最大指数值,在进行对这个数n的取模计算即可。

package com.item.action;
import java.util.Scanner;
public class Main {
  public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    sc.close();
    /**
     * 判断一个数是否是7的指数,n取值范围int值内
     * 7的11次幂就是int值内的最大数。1977326743
     */
    if(1977326743%n==0) {
      System.out.println(true);
    }else {
      System.out.println(false);
    }
  }
}

输入测试49,输出结果true

相关文章
|
4天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
58 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1007 印章
30 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1006 拿金币
24 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1004 无聊的逗
48 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1003 礼物
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1003 礼物
54 0
|
4天前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
43 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
41 0
|
4天前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
50 0
|
4天前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
44 0
|
4天前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
29 1