LintCode练习:2826 · 数字 2 的朋友

 

题目来源:LintCode运算符练习

 

参考代码:

 1 public static boolean isFriend(int n) {
 2         if(n % 2 != 0){ // 奇数 去掉1之后的偶数必须是2的幂次方才能返回true
 3             n -= 1;
 4             while(n % 2 == 0)
 5                 n/=2;
 6             if (n == 1)
 7                 return true;
 8             else
 9                 return false;
10         }
11         int nc = n;  // 偶数 需满足2^x+2^y,且x!=y,才返回true
12         for(int i=1;;i++){
13             n = nc;
14             int n1 = (int) Math.pow(2,i);  // 判断第一个加数n1=2^i时,下一个加数n-2^i是不是2的幂次方
15             if(n1*2 == n) // x!=y
16                 return false;
17             n -= n1;
18             int j = 0; // j用途:防止出现n=2^x的情况,虽然前面的if语句可以防止,但是只有在某一个i才可能阻止误判
19             if(n <= 0) // 若一直找不到合适的加数,返回False,此处可继续优化
20                 return false;
21             while(n % 2 == 0){
22                 n /= 2;
23                 j++;
24             }
25             if(j != i && n == 1)
26                 return true;
27         }
28     }

 

posted @ 2021-12-22 17:49  achived  阅读(101)  评论(0编辑  收藏  举报