指数计划

时间:2014-10-16 17:41:56

标签: algorithm

我正在尝试快速取幂。但结果似乎没有产生正确的结果。任何帮助,将不胜感激。 编辑:管理解决它感谢所有的帮助。

        if (content[i] == '1')
            s1 = (int)(po1 * (Math.pow(po1, 2)));
        else
            s1 = po1 * po1;
        final_result *= temp;

3 个答案:

答案 0 :(得分:1)

查看此Exponation by squaring

每次在指数中遇到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