第十四届蓝桥杯集训——if——配套用法示例
目录
第十四届蓝桥杯集训——if——配套用法示例
方法1
方法2
其它指数幂
输入一个数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