#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/*思路1-递归*/
/*
x^(n-1)*x 当n为奇数
x^n = x^(n/2)*x^(n/2) 当n为偶数
1 当n等于0
*/
ll ksm_1(ll x, ll n)
{
if (n == 0)
return 1;
else if (n & 1) /*n % 2 == 1*/
return ksm_1(x, n - 1) * x;
else
{
int temp = ksm_1(x, n / 2);
return temp * temp;
}
}
/*思路2-二进制*/
/*
7^10 = 7^(1010)_2 = 7^(1000)_2 * 7^(10)_2
7^10 = 7^8 * 7^2
*/
ll ksm_2(ll x, ll n)
{
ll ans = 1;
while(n)
{
if(n & 1) //如果n的当前末位为1
ans *= x; //ans乘上当前的x
x *= x; //x自乘
n >>= 1; //n往右移一位
}
return ans;
}
/*快速乘思路1-递归*/
/*
a*(b-1)+a 当n为奇数
a*b = a* 当n为偶数
1 当n等于0
*/
ll ksc(ll a, ll b)
{
ll ans;
if(b == 0)
{
return 0;
}
if(b % 2 == 0)
{
ll now = ksc(a, b / 2); /*如果c很大的话会导致溢出 c的范围[0, 10^12]*/
ans = now + now;
}
else
{
ll now = ksc(a, b / 2);
ans = now + now + a;
}
return ans;
}
int main()
{
cout << ksm_1(2,20) << endl;
cout << ksm_2(2,20) << endl;
cout << ksc(123456,20214200) << endl;
return 0;
}
[算法]快速幂和快速乘
于 2022-03-14 23:43:28 首次发布