我正在尝试快速取幂。但结果似乎没有产生正确的结果。任何帮助,将不胜感激。 编辑:管理解决它感谢所有的帮助。
if (content[i] == '1')
s1 = (int)(po1 * (Math.pow(po1, 2)));
else
s1 = po1 * po1;
final_result *= temp;
答案 0 :(得分:1)
每次在指数中遇到1位时,你可能想要对你的基数进行位移和平方
int pow(int base, int e)
{
int retVal = 1;
while (e)
{
if (e % 2 == 1)//i.e. last bit of exponent is 1
retVal *= base;
e >>= 1; //bitshift exponent to the right.
base *= base; // square base since we shifted 1 bit in our exponent
}
return retVal ;
}
考虑它的好方法是你的指数被分解:比如说,6^7
(比特的指数是1,1,1)= 6^1 * 6^2 * 6^4 = 6 * 36 * 36^2 = 6 * 36 * 1296
。你的基地总是自我平衡。
答案 1 :(得分:0)
temp = (int)(g1 * (Math.pow(g1, 2)));
这基本上归结为g1
3 。我不熟悉这种算法,但这可能是对的。
此外,作为旁注,请勿拨打Math.pow(<var>, 2)
,只需撰写<var> * <var>
。
答案 2 :(得分:0)
您的代码存在一些问题,首先是您正在以错误的方向读取exp字符串,添加基数的额外乘法,而不是在提高幂时考虑1
的等级2。
这是你想要实现的蟒蛇快速草图:
a = int(raw_input("base"))
b = "{0:b}".format(int(raw_input("exp")))
res = 1
for index, i in enumerate(b[::-1]):
if i == '1':
res *= a**(2**index)
print res
或者,您可以在每次迭代时改为平方:
for index, i in enumerate(b[::-1]):
if i == '1':
res *= a
a *= a