浅析快速幂
首先,举个例子(假设数据全为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次效率会高很多。 说明:原创。自己的学习笔记,可供他人参考。
时间: 2024-10-12 11:46:36