数值乘方算法

来源:互联网 发布:b站mac客户端下载视频 编辑:程序博客网 时间:2024/06/05 09:05

数值乘方算法


#include<iostream>using namespace std;/*** 求一个整数的乘方* @param num 要乘方的数字* @param power 多少次方* @return*/static int MulCount;//记录乘法次数//递归版本1int 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;//标记已经被计算的num^powerint *powMemo;//记录已经被计算的num^powerint power_v2(int const num, int const power){    if (isdone[power])        return powMemo[power];    if (power % 2 == 0){        isdone[power] = true;//标记num^power已经被计算        powMemo[power] = power_v2(num, power >> 1) * power_v2(num, power >> 1);//将num^power记录下来        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型有32位,最高位为符号位,有效位只有31位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){//第OFFSET+1是否为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)<<" 所做乘法次数:"<<MulCount<<endl; //得到错误的MulCount值,因为参数从右向左处理。    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");}

输出结果

0 0
原创粉丝点击