一、题目描述
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题
二、解题思路
在不考虑大数问题下,此题还需要考虑的点包括:
1)底数为0 并且 指数为负数 -- 分母不能为0 --> 需要有错误标识
2)指数为负数时,结果需要取倒
为了提高运算效率,在求次方运算时,不使用for循环运算exponent次,而是使用递归,时间复杂度控制在log(exponent),具体解法见算法
三、解题算法
/***************************************************
author:tmw
date:2018-08-26
****************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/** double_equal() double类型变量的判等函数
* @param double a
* @param double b
**/
bool double_equal( double a, double b )
{
//0.0000001为精度,在精度范围内,表示两个值相等
if( a-b > -0.0000001 && a-b < 0.0000001 )
return true;
else
return false;
}
/** power_compute() 用递归,复杂度为log(n)的次方运算----需要考虑奇偶数
* @param double base
* @param int exponent
**/
double result = 1.0;
double power_compute( double base, int exponent )
{
/**特殊情况**/
if( exponent == 0 )
return 1.0;
/**递归出口--初始值**/
if( exponent == 1 )
return base;
/**递归**/
result = power_compute(base, exponent/2);
result *= result;
/**exponent为奇数时,单独考虑,多乘一次底数**/
if( exponent%2 == 1 )
result *= base;
return result;
}
/** 主算法:power(double base, double exponent) 求base的exponent次方
* @param double base
* @param double exponent
**/
bool is_Invalid = false; //用这个全局变量标识程序标识该算法是否因非法输入而退出
double power( double base, int exponent )
{
/**底数为0且指数为负数,此时分母为0,非法输入,程序退出**/
if( double_equal( base, 0.0 ) && exponent < 0 )
{
is_Invalid = true;
return 0.0;
}
int abs_exponent = abs(exponent);
double result = power_compute( base, abs_exponent );
/**考虑exponent为负数的情况**/
return exponent>0?result:(1.0/result);
}
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~