【面试题十一】数值的整数次方
来源:互联网 发布:免费淘宝店标在线制作 编辑:程序博客网 时间:2024/05/20 09:27
数值的整数次方
不能用等号判断不精确数字是不是相等;
在软件开发过程中,永远不变的就是需求会一直改变。
实现函数 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:cleanCPP=g++CFLAGS=-Wall -gBIN=testOBJS=Power.oLIBS=$(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.
- 【面试题十一】数值的整数次方
- 面试题11:数值的整数次方
- 面试题11 数值的整数次方
- 面试题11:数值的整数次方
- 面试题11-数值的整数次方
- 面试题11数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 面试题:数值的整数次方
- 面试题11:数值的整数次方
- 【面试题11】数值的整数次方
- 面试题11:数值的整数次方
- 面试题11:数值的整数次方
- 【面试题11】数值的整数次方
- 在那不遥远的地方
- 嵌入式C语言中volatile的理解
- javascript编程规范
- LeetCode ZigZag Conversion
- 1070[Hansel and Grethel]
- 【面试题十一】数值的整数次方
- Linux下USB驱动框架分析
- 【面试题十二】打印1到最大的n位数
- 如何甄别优秀博文
- Eclipse SVN (Subclipse的更新日志)、版本集合(1.10.0起)、更新、安装方法!
- iostream.h和iostream 区别
- 【面试题十三】在O(1)时间删除链表结点
- Ubuntu 12.04 安装QQ 2012
- JAVA与数据库直接时间问题汇总