#数据结构与算法学习笔记#剑指Offer11:求数值的整数次方/实现库函数pow + 判断double为0 + 测试用例(Java、C/C++)

本文介绍了一种高效计算浮点数的整数次幂的方法,并提供了Java和C++两种语言的具体实现。通过对指数进行位操作,避免了重复乘法运算,提高了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018.8.7     《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门​​​​​​​

一道经典的复现库函数pow的题目。

如果直接连乘效率会比较低,可以考虑利用x^{n} = x^{n/2} \times x^{n/2}

注意:1.几个边界条件:底数为0,指数为0,指数为负。2.判断double不能用底数base == 0.0,要写专门的函数equal来判断。


题目描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。


JAVA实现:

/**
 * 
 * @author ChopinXBP
 *         复现库函数pow:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 *
 */

public class MyPower {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		double num = MyPow(3, 6);
		System.out.println(num);
	}

	public static double MyPow(double base, int exponent) {

		if (exponent < 0) {
			base = 1 / base;
			exponent = -exponent;
		} else if (exponent == 0) {
			return 1.0;
		} else if (exponent == 1) {
			return base;
		}

		// 优化方式:用exponent >> 1代替exponent/2,用(exponent & 0x1) == 0代替exponent%2 == 0
		if ((exponent & 0x1) == 0) {
			return MyPow(base, exponent >> 1) * MyPow(base, exponent >> 1);
		} else if ((exponent & 0x1) == 1) {
			return base * MyPow(base, exponent >> 1) * MyPow(base, exponent >> 1);
		}

		return -1; // 边界base为0,返回-1
	}

	// 注意考虑边界base为0,判断double不能用base == 0.0,要写专门的函数equal来判断
	public static boolean equal(double num1, double num2) {
		if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
			return true;
		else
			return false;
	}

}

C++实现参考:

double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    if(exponent == 0)
        return 1;
    if(exponent == 1)
        return base;

    double result = PowerWithUnsignedExponent(base, exponent >> 1);
    result *= result;
    if((exponent & 0x1) == 1)
        result *= base;

    return result;
}

测试代码:

// ====================测试代码====================
void Test(double base, int exponent, double expectedResult, bool expectedFlag)
{
    double result = Power(base, exponent);
    if(abs(result - expectedResult) < 0.00000001 
        && g_InvalidInput == expectedFlag)
        printf("Test passed.\n");
    else
        printf("Test failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    // 底数、指数都为正数
    printf("Test1 begins.\n");
    Test(2, 3, 8, false);

    // 底数为负数、指数为正数
    printf("Test2 begins.\n");
    Test(-2, 3, -8, false);

    // 指数为负数
    printf("Test3 begins.\n");
    Test(2, -3, 0.125, false);

    // 指数为0
    printf("Test4 begins.\n");
    Test(2, 0, 1, false);

    // 底数、指数都为0
    printf("Test5 begins.\n");
    Test(0, 0, 1, false);

    // 底数为0、指数为正数
    printf("Test6 begins.\n");
    Test(0, 4, 0, false);

    // 底数为0、指数为负数
    printf("Test7 begins.\n");
    Test(0, -4, 0, true);

    return 0;
}

#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值