以最大元素为基准元素,判读其他元素能否通过 x 2 成为最大值!
那么怎么判断呢:
- max % arr[i] == 0
- arr[i] * 2 ^n == max
int x = 2 ^ n == max / arr[i]
3.只需判断 这个 x 是不是 2 的 n 次放就可以了!
判断 是否为 2 的 n 次 (位运算):
对于一个 2 的 n 次方的数,它在二进制表示下只有一个位是 1,其余位都是 0。例如,2(二进制为 10)、4(二进制为 100)、8(二进制为 1000)等。
当我们对一个 2 的 n 次方的数 n 进行 n & (n - 1) 操作时,结果为 0。这是因为 n - 1 的二进制表示就是将 n 的二进制表示中唯一的那个 1 变成 0,然后其后的所有 0 都变成 1。例如,8(二进制 1000),7(二进制 0111),它们进行按位与操作 1000 & 0111 结果就是 0。而如果一个数不是 2 的 n 次方,那么它的二进制表示中不止一个 1,进行 n & (n - 1) 操作就不会得到 0。
public class PowerOfTwoChecker {
public static boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
return (n & (n - 1)) == 0;
}
}
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[n];
int max = 0 ;
for(int i = 0; i < n; i++) {
a[i] = in.nextInt();
max = Math.max(max,a[i]);
}
boolean flag = true;
for(int i = 0 ; i < n; i++) {
if(max % a[i] != 0) {
flag = false;
break;
}
int x = max / a[i];
if((x & (x - 1)) != 0) {
flag = false;
break;
}
}
if(flag) System.out.println("YES");
else System.out.println("NO");
}
}