2014-10-16 3 views
3

Я пытаюсь сделать быстрое возведение в степень. Но результат, похоже, не дает правильного результата. Любая помощь будет оценена по достоинству. РЕДАКТИРОВАТЬ: Удалось решить эту проблему благодаря всей помощи.Программа возведения в степень

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

'Math.pow (1, 2)' равно 1. – njzk2

+0

'(Math.pow (g1, 2))' неверно, вероятно, должно быть '(Math.pow (i, 2))', и вы, вероятно, захотите сначала переверните строку – njzk2

+0

После того, как ваша версия 'result' никогда не инициализируется, результат будет всегда 0 – msrd0

ответ

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. Ваша база всегда возводится в квадрат.

+0

@LennonChia: грустно. какой-либо конкретной причине? – njzk2

0

temp = (int)(g1 * (Math.pow(g1, 2)));

Это в основном просто сводится к g1 . Я не знаком с этим алгоритмом, но это невозможно.

Кроме того, в качестве примечания стороны никогда не звоните Math.pow(<var>, 2), просто напишите <var> * <var>.

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 
Смежные вопросы