数值乘方算法
#include<iostream>
using namespace std ;
static int MulCount;
int power_v1(int const num, int const power){
if (power == 1 ){
return num;
}
if (power % 2 == 0 ){
MulCount++;
return power_v1(num, power>>1 ) * power_v1(num, power>>1 );
}
MulCount++;
return num * power_v1(num, power>>1 ) * power_v1(num, power>>1 );
}
bool *isdone;
int *powMemo;
int power_v2(int const num, int const power){
if (isdone[power])
return powMemo[power];
if (power % 2 == 0 ){
isdone[power] = true ;
powMemo[power] = power_v2(num, power >> 1 ) * power_v2(num, power >> 1 );
MulCount++;
return powMemo[power];
}
isdone[power] = true ;
powMemo[power] = num*power_v2(num, power >> 1 ) * power_v2(num, power >> 1 );
MulCount++;
return powMemo[power];
}
const int OFFSET = 30 ;
int power_v3(int const num, int const power){
int temp;
int involution(1 );
if (num % 2 != 0 ) involution = num;
for (int j(OFFSET); j > 0 ; j--){
if ((power >> j) & 1 ){
temp = num;
for (int i(0 ); i < j; i++){
MulCount++;
temp *= temp;
}
MulCount++;
involution *= temp;
}
}
return involution;
}
int main(){
int num, power;
cout << "输入底数和指数以空格分开" << endl;
cin >> num >> power;
MulCount = 0 ;
cout << "v1结果:" << power_v1(num, power);
cout << " 所做乘法次数:" << MulCount << endl;
powMemo = new int [power+1 ];
isdone = new bool [power+1 ];
for (int i(2 ); i <= power; i++)isdone[i] = false ;
isdone[0 ] = true ; isdone[1 ] = true ;
powMemo[0 ] = 1 ; powMemo[1 ] = num;
MulCount = 0 ;
cout << "v2结果:" << power_v2(num, power);
cout << " 所做乘法次数:" << MulCount << endl;
MulCount = 0 ;
cout << "v3结果:" << power_v3(num, power);
cout << " 所做乘法次数:" << MulCount << endl;
system("pause" );
}