上海理工大學第二屆“聯想杯”全國程式設計邀請賽 J.JXC&Jesus(線性篩)
阿新 • • 發佈:2021-06-16
描述
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
保證base和exponent不同時為0。不得使用庫函式,同時不需要考慮大數問題,也不用考慮小數點後面0的位數。
實際上就是實現一個計算 a ^ b 的函式。
樸素演算法
讓 exponent 個 base 相乘,時間複雜度是 O(exponent)。
// c++ class Solution { public: double Power(double base, int exponent) { double res = 1; if (exponent < 0) base = 1 / base, exponent = -exponent; // 注意指數為負,底數變成 1/base while (exponent--) res *= base; return res; } };
# python3
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
res = 1
if exponent < 0: base, exponent = 1/base, -exponent
for _ in range(exponent):
res *= base
return res
快速冪
將 exponent 看成二進位制,例如:
a ^ (0b1011) = a ^ (0b1000 + 0b0000 + 0b0010 + 0b0001) = a^(0b1000) * a^(0b0000) * a^(0b0010) * a^(0b0001) = (1 * a^(2^3)) * (0 * a^(2^2)) * (1 * a^(2^1)) * (1 * a^(2^0))
可以看出規律,exponent 每一位是否為 1 決定了是否乘 base 的某次方,而 base 的某次方可以通過迴圈累乘得到,這樣就把演算法的時間複雜度降為了 O(log(exponent))。這個方法也叫快速冪。
// c++ class Solution { public: double Power(double base, int exponent) { double res = 1; if (exponent < 0) base = 1 / base, exponent = -exponent; while (exponent) { if (exponent & 1) res *= base; base *= base; exponent >>= 1; } return res; } };
# python3
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
res = 1
if exponent < 0: base, exponent = 1/base, -exponent
while exponent:
if exponent & 1: res *= base
base, exponent = base ** 2, exponent // 2
return res