这道题是一道规律
1到10 中是不是只有3 5 6 7 9 10
满足规律,你说对吧
那我们来看不满足规律的有那些呢
是不是1 2 4 8 等等
你发现什么了是不是所有的2 的幂次方都不满足
只要不是2 的幂次方就都是合法的数字
ok思路有了那我们怎么来判断输入的某一个数是不是2 的整数次幂呢?
我一开始的思路不太对
我想的是用一个数组来存储2的0次幂到2 的17次幂的大小
然后来个循环
对每一个输入的数都进行判断只有等于数组中的一个就跳出循环然后cnt++
但是不知到为啥答案错误了
emm
感觉没问题,但是只能拿到30%
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Scanner;
import java.util.StringTokenizer;
/**
* @author zb
* date2025/3/30 18:19
*/
public class Main {
static long binary[] = new long[18];
public static void main(String[] args) {
// System.currentTimeMillis();
// Scanner in = new Scanner(System.in);
for (int i = 0; i <=17 ; i++) {
binary[i] = (long) Math.pow(2,i);
}
long n = in.nextLong();
long cnt = 0;
while (n-->0){
int flage = 0;
long num = in.nextLong();
for (int i = 0; i <=17 ; i++) {
if(num==binary[i]){
flage = -1;
break;
}
}
if(flage==-1){
cnt++;
}
}
out.println(cnt);
out.flush();
// in.close();
}
static FastReader in =new FastReader();
static PrintWriter out = new PrintWriter(System.out);
static class FastReader{
static BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st = new StringTokenizer("");
String next(){
while (!st.hasMoreElements()){
try {
st =new StringTokenizer(br.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return st.nextToken();
}
int nextInt(){
return Integer.parseInt(next());
} double nextDouble(){
return Double.parseDouble(next());
}
long nextLong(){
return Long.parseLong(next());
}
}
}
下面是正确的
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Scanner;
import java.util.StringTokenizer;
/**
* @author zb
* date2025/3/30 18:19
*/
public class Main {
static long binary[] = new long[18];
public static void main(String[] args) {
// System.currentTimeMillis();
// Scanner in = new Scanner(System.in);
for (int i = 0; i <=17 ; i++) {
binary[i] = (long) Math.pow(2,i);
}
long n = in.nextLong();
long cnt = 0;
while (n-->0){
int flage = 0;
long num = in.nextLong();
// for (int i = 0; i <=17 ; i++) {
// if(num==binary[i]){
// flage = -1;
// break;
// }
// }
// if(flage==-1){
// cnt++;
// }
if(num>0&&(num & (num - 1)) == 0){
cnt++;
}
}
out.println(cnt);
out.flush();
// in.close();
}
static FastReader in =new FastReader();
static PrintWriter out = new PrintWriter(System.out);
static class FastReader{
static BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st = new StringTokenizer("");
String next(){
while (!st.hasMoreElements()){
try {
st =new StringTokenizer(br.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return st.nextToken();
}
int nextInt(){
return Integer.parseInt(next());
} double nextDouble(){
return Double.parseDouble(next());
}
long nextLong(){
return Long.parseLong(next());
}
}
}
这一段是核心代码
x如果是2的整数幂次方,那么
x的二进制数 肯定是1 开头后面都是0
而x-1则相反
x-1 的二进制数是0开头后面都是1
你想一下
如果一下数再加一就是2 的整数次幂
那么他是不是再加1 就变成最前面是1 后面都是0
比如
2 的5次方对应的二进制数
100000
2的5次方对应的二进制数-1
是不是
011111
两者进行位运算与 &
是不是就是0
if(num>0&&(num & (num - 1)) == 0){
cnt++;
}