1. 程式人生 > >基礎快速冪運算

基礎快速冪運算

std -a main 基礎 快速求冪 原創 之前 暫時 names

淺析快速冪

首先,舉個例子(假設數據全為long long型)。

例題:輸入a,n, 求a的n次方(a > 0)。


看到這個例題,肯定是思路滾滾來啊,不就是相當於n個a相乘嗎?於是乎,就上代碼了:

#include<iostream>
using namespace std;
long long ans(long long &a, long long &n) {
  long long sum = 1;
  for (int i = 1; i <= n; i++) {
    sum *= a;
  }
  return sum;
}
int main() {
  
long long a, n; while (cin >> a >> n) { cout << ans(a, n) << endl; } }

but,這種做法是暴力的,不怎麽科學的,在各大OJ刷題網站上肯定是超時的。於是乎,快速冪應運而生。
理論暫時置一邊,舉個例子先:
1.當n為偶數時,an = a(n/2)*2 = (a2)(n/2)
2.當n為奇數時,an = a * a(n-1) = a*(a(n-1)/2)2
是不是有種二分的感覺,就是一直把n做除以2處理,直至n為0,

再在具體到程序,便是這樣的:
#include<iostream>
using
namespace std; long long ans(long long &a, long long &n) { long long sum = 1; while (n > 0) { if (n & 1) {//n為奇數時 sum = sum * a; } a = a * a; n /= 2; } return sum; } int main() { long long a, n; while (cin >> a >> n) { cout << ans(a, n) << endl; } }


當然,這就是最基本的快速冪了,顧名思義就是快速求冪,比之前的暴力循環n次效率會高很多。

說明:原創。自己的學習筆記,可供他人參考。

 



基礎快速冪運算