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 }