【发布时间】:2016-10-12 06:19:59
【问题描述】:
我正在尝试检查一个数字(输入为 String)是否是 2 的幂。问题是该数字可能大于 2^64(长长限制)。如果我将它存储在 double 中,那么我无法对其进行二进制操作(因此技巧 v & (v - 1) == 0 不起作用)。这是我偶然发现的解决方案:
public class Solution {
public int power(String A) {
String dividend = A;
StringBuilder str;
if (A == null || A.length() == 0)
return 0;
if (A.length() == 1 && A.charAt(0) == '0')
return 0;
while (dividend.length() > 0 && !dividend.equalsIgnoreCase("2")) {
str = new StringBuilder();
int carry = 0;
int n = dividend.length();
if (n > 0) {
int num = dividend.charAt(n - 1) - '0';
if (num % 2 == 1)
return 0;
}
for (int i = 0; i < n; i++) {
char c = (char) (dividend.charAt(i) - '0');
int res = c + 10 * carry;
c = (char) (res / 2 + '0');
carry = res % 2;
str.append(c);
}
if (str.charAt(0) == '0')
str.deleteCharAt(0);
dividend = str.toString();
}
return 1;
}
}
我在理解解决方案时遇到问题。如果一个数字是奇数或不是奇数,则进行第一次检查。我在理解在这个问题中完成的手动除法的实现时遇到了问题(尤其是涉及 char 和 int 的算术运算)。我得到'0' == 48 并从字符中减去'0' 将其转换为整数值。谁能向我解释一下这个除法操作是如何在这里实施的?谢谢!
【问题讨论】:
标签: java string character division