标签:很多 font size clu 偶数 strong 程序 pre 循环
浅析快速幂
首先,举个例子(假设数据全为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次效率会高很多。
说明:原创。自己的学习笔记,可供他人参考。
标签:很多 font size clu 偶数 strong 程序 pre 循环
原文地址:http://www.cnblogs.com/filters/p/7979315.html