forked from MakeContributions/DSA
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(CPlusPlus): add binary power on maths algorithm (MakeContributi…
…ons#810) Co-authored-by: angshudas <[email protected]> Co-authored-by: Mohnish Deshpande <[email protected]>
- Loading branch information
1 parent
a68c012
commit 88b0e15
Showing
2 changed files
with
57 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#include<iostream> | ||
using namespace std; | ||
|
||
/* | ||
The idea is to half the power on every iteration | ||
Computes the power in log(n) operations | ||
On every iteration: | ||
Square the base, half the power | ||
Special case - if power is odd: | ||
Multiply the ans with a | ||
Because the ODD-NUMBER % 2 == 1 | ||
Note: There will always be one iteration where power is odd | ||
*/ | ||
|
||
long binpow(long a, long b){ | ||
long ans=1; | ||
// while b is greater than zero, we continue the binary exponentiation | ||
while(b>0){ | ||
// if b is odd, multiply result with base | ||
if(b&1) | ||
ans *= a; | ||
// square the base | ||
a *= a; | ||
// half the power | ||
b /= 2; | ||
} | ||
return ans; | ||
} | ||
|
||
// source: @angshudas | ||
long binpow_rec(long a, long b){ | ||
// a^0 = 1 [for any a] | ||
if(b==0) | ||
return 1; | ||
// recursive call for a^(b/2) | ||
long ans = binpow_rec(a, b/2); | ||
// square the result | ||
ans *= ans; | ||
// if b is odd, times by a | ||
// to cover for | ||
if(b&1) | ||
ans *= a; | ||
|
||
return ans; | ||
} | ||
|
||
int main(){ | ||
long base, power; | ||
cout<<"Enter the base and power: "<<endl; | ||
cin>>base>>power; | ||
cout<<base<<" ^ "<<power<<" = "<<binpow(base, power)<<endl; | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters