【面试题十一】数值的整数次方

数值的整数次方


不能用等号判断不精确数字是不是相等;

在软件开发过程中,永远不变的就是需求会一直改变。


实现函数 double Power(double base, int exponent),求base的exponent次方,不得使用库函数,同时步需要考虑大数问题。

这个指数可能是0,正数,或者负数,


判断两个小数是否相等,不能判断他们之差的绝对值是不是在一个很小的范围内,如果两个数相差很小, 就可以认为他们相等;


Power.cpp:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);

double Power(double base, int exponent)
{
	g_InvalidInput = false;

	if(equal(base, 0.0) && exponent < 0)
	{
		g_InvalidInput = true;
		return 0.0;
	}

	unsigned int absExponent = (unsigned int)(exponent);
	if(exponent < 0)
	{
		absExponent = (unsigned int)(-exponent);
	}
	double result = PowerWithUnsignedExponent(base, absExponent);
	if(exponent < 0)
	{
		result = 1.0 / result;
	}

	return result;
}

/*
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
    double result = 1.0;
    /
    for(int i = 1; i <= exponent; ++i)
        result *= base;
 
    return result;
}
*/


double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
	if(exponent == 0)
	{
		return 1;
	}
	if(exponent == 1)
	{
		return base;
	}
	/*除2运算用右移运算来实现效率更高*/
	double result = PowerWithUnsignedExponent(base,exponent >> 1);
	result *= result;
	/*判断是奇数还是偶数*/
	if((exponent & 0x1) == 1)
	{
		result *=base;
	}
	return result;
}

bool equal(double num1, double num2)
{
	if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
	{
		return true;
	}
	else
	{
		return false;
	}
}


// ====================测试代码====================
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 main()
{
	// 底数、指数都为正数
    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;
}


Makefile

.PHONY:clean
CPP=g++
CFLAGS=-Wall -g
BIN=test
OBJS=Power.o
LIBS=
$(BIN):$(OBJS)
	$(CPP) $(CFLAGS) $^ -o $@ $(LIBS)
%.o:%.cpp
	$(CPP) $(CFLAGS) -c $< -o $@
clean:
	rm -f *.o $(BIN)


运算结果:

Test1 begins.
Test passed.
Test2 begins.
Test passed.
Test3 begins.
Test passed.
Test4 begins.
Test passed.
Test5 begins.
Test passed.
Test6 begins.
Test passed.
Test7 begins.
Test passed.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值