数值乘方算法
来源:互联网 发布: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
- 数值乘方算法
- 乘方算法
- 乘方的算法
- 乘方(幂)算法比较
- 乘方(幂)算法比较
- 乘方的优化算法
- 算法训练 矩阵乘方
- 算法训练 矩阵乘方
- 算法训练 矩阵乘方
- 快速计算乘方的算法
- 蓝桥杯 算法提高 矩阵乘方
- 漫画算法:判断2的乘方
- 数值算法
- 数值算法
- 数值算法
- 数值算法
- 数值算法
- 数值算法
- 剑指offer——二叉搜索树的第k个结点
- JavaScript中什么是构造函数?
- JSP动作指令详解
- 微软Build2016:Xamarin杂记
- NYOJ 最大和
- 数值乘方算法
- 【9-1】什么是迭代
- Android获得当前日期和时间的方法
- 设计模式(五)--适配器模式
- socket同步、异步、阻塞和非阻塞
- CNTK从入门到深入研究(8) - CNTK工程结构(CNTK Core)
- Eclipse常用快捷键
- dm9000网卡驱动分析(一)
- JavaScript原型链详细介绍