java 判断给定数是否为2的幂

gblwokeq  于 2023-03-06  发布在  Java
关注(0)|答案(3)|浏览(96)

判断给定数是否为2的幂。

**输入:**数字长度可以大于64,这意味着数字可以大于2 ^ 64(超出long long范围)(以字符串形式给出)
**输出:**如果数字是2的幂,则返回1,否则返回0
**示例:**输入:128输出:1

这是在一个编码平台上,BigInteger没有被导入,我不得不对字符串执行操作,要么不修改它的数据类型,要么使用数学公式来防止溢出。

class Solution {
  public static int power(String A) {
      /* write your solution here */
      while(Integer.parseInt(A)>1){
          if(Integer.parseInt(A)%2!=0)
          return 0;
       A=Integer.toString(Integer.parseInt(A)/2);
      }
      return 1;
      
      //long num=Long.parseUnsignedLong(A);
      //while(num>1){
      //    if(num%2!=0)
           //  return 0;
         //num=num/2;
       //}
      // return 1; // The input can be upto 21 characters long, and that's why unsigned long didn't work.
      
  }
}

我应该怎么做?(请只在java中)

v2g6jxz6

v2g6jxz61#

如果你把一个十进制数转换成二进制数,那么所有2的幂都以1开头,其余的都是0。

1:10
2:100
3:1000
4:10000
5:100000
6:1000000

所以首先,你需要把字符串数字转换成二进制字符串,然后检查这个模式是否匹配(也许用一个循环)。如果你想找的话,你可以很容易地在网上找到第一部分。

kmynzznz

kmynzznz2#

这个方法将给予String除以2的String表示。继续除以得到一个可管理的长度。

public static String half(String x) {
AtomicInteger over = new AtomicInteger(0);
return Arrays.stream(x.split(""))
        .mapToInt(Integer::parseInt)
        .map(a -> {
            int next = (over.get()+a)/2;
            over.set( a % 2 == 0? 0 : 10);
            return next;
        })
        .mapToObj(String::valueOf)
        .collect(Collectors.joining());

}

tzdcorbm

tzdcorbm3#

public static int isPowerOfTwo(String number) {
    // Remove leading zeros
    number = number.replaceAll("^0+", "");
    
    // If the number is zero or has more than one non-zero digit, it's not a power of two
    if (number.length() == 0 || (number.length() > 1 && !number.equals("1"))) {
        return 0;
    }
    
    // Convert the last digit to an integer
    int lastDigit = number.charAt(number.length() - 1) - '0';
    
    // If the last digit is odd, it's not a power of two
    if (lastDigit % 2 == 1) {
        return 0;
    }
    
    // Divide the number by two until it becomes 1 or an odd number
    while (number.length() > 1) {
        int carry = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < number.length(); i++) {
            int digit = number.charAt(i) - '0';
            int temp = carry * 10 + digit;
            sb.append(temp / 2);
            carry = temp % 2;
        }
        number = sb.toString().replaceAll("^0+", "");
        if (carry == 1) {
            return 0;
        }
    }
    
    return 1;
}

代码的工作:
1.我们从输入字符串中删除所有前导零,因为它们不影响数字是否为2的幂。
1.如果数字是零或者有一个以上的非零数字,它就不能是2的幂,所以我们返回0。
1.否则,我们检查最后一位数是否为奇数,如果是奇数,则该数字不可能是2的幂,因此返回0。
1.如果最后一位数是偶数,我们将数字除以2,直到它变成1或奇数。我们通过重复将数字的每一位数除以2,跟踪任何进位,并将结果附加到StringBuilder中。如果除法后剩余进位,则数字不是2的幂,我们返回0。
1.如果我们到达循环的末尾,数字是1,它是2的幂,所以我们返回1。

**注意:**此代码假定输入字符串表示非负整数。如果允许负数,则可能需要添加额外的检查以正确处理它们。

相关问题