11-数值的整数次方

一、题目描述

实现函数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);
}

 

                                                                                         梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值