数值整数次方

来源:互联网 发布:淘宝店铺怎么申请 编辑:程序博客网 时间:2024/06/06 11:48
/********************************************题目:实现函数double Power(double base, int exponent)求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。********************************************/#include<iostream>bool equal(double num1, double num2);double powerWithUnsignedExponent(double base, unsigned int absExponent);double Power(double base, int exponent){if(equal(base,0) && exponent <=0)//考虑无效输入throw new std::exception("Invalid input!");unsigned int absExponent = exponent;if(exponent < 0)//考虑指数为负数的情况absExponent = unsigned int(-exponent);double result = powerWithUnsignedExponent(base,absExponent);if(exponent<0)//得到指数为负数的结果return 1.0/result;return result;}/*时间复杂度为O(N)double powerWithUnsignedExponent(double base, unsigned int absExponent){double result = 1.0;for(int i=1; i<=absExponent; i++)//实现base^absExponentresult *= base;return result;}*///判断两个double是否相等bool equal(double num1, double num2){if((num1-num2>0.0000001)&& (num1-num2<0.0000001))return true;elsereturn false;}//上面注释的powerWithUnsignedExponent()方法虽然能满足功能,//但是不够高效时间复杂度为O(n)//以下方法利用//a^n = a^(n/2) * a^(n/2);当n为偶数//a^n = a^((n-1)/2) * a^((n-1)/2) * a;当n为奇数//其时间复杂度为O(NlogN)double powerWithUnsignedExponent(double base, unsigned int absExponent){if(absExponent == 0)return 0;if(absExponent == 1)return base;double result = powerWithUnsignedExponent(base,absExponent >> 1);//右移代替除以2result *= result;if(absExponent & 0X01 == 1)//判断absExponent是不是奇数result *= base;return result;}int main(){double result1 = Power(2,4);//基数和指数都为正式double result2 = Power(2,0);//指数为0double result3 = Power(-2,1);//指数为1double result4 = Power(-3,-2);//指数为负数std::cout << result1 <<std::endl;//结果输出std::cout << result2 <<std::endl;std::cout << result3 <<std::endl;std::cout << result4 <<std::endl;return 0;}//由于计算机表示的小数(float和double)都有误差,我们不能直接用等号(==)//判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0,.0000001//就可以认为他们相等。//用位运算替换乘除法,效率高很多

==参考剑指offer

0 0
原创粉丝点击