高质量的代码:容错处理能力,规范性,完整性。尽量展示代码的可扩展型和可维护性。

容错处理能力:特别的输入和处理,异常,资源回收。

规范性:清晰的书写,清晰的布局,合理的命名。

完整性:功能测试,边界测试,负面测试。

三种错误处理方法:

1.返回值。eg:很多Windows API,返回为0正确,不为0对应各种错误。

缺点:不能把计算结果赋值给其他变量或作为参数传递给其他函数。

2.出错时设置全局变量。此时我们可以在返回值中传递计算结果。eg:Windows很多API运行出错后,会设置全局变量,可通过GetLastError分析错误的全局变量。

缺点:调用者容易忘记检查全局变量,调用出错时,很容易忘记做错误处理。留下安全隐患。

3.异常。函数运行出错抛异常。不同出错原因定义不同的异常类型。并且做相应的处理。c不支持,c#强烈推荐。

缺点:抛异常时候程序的执行会打乱正常的顺序,影响性能。

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

思路:用一个全局变量g_InvaildPut来表示出错时的情况,当g_InvaildPut为true时,返回0.0,表示出错。当exponent<0的时候absExponent=-exponent.

result=1.0/result;其中result的值通过double PowerWithExponent(double base,int exponent)返回。这个函数用到了一个公式如下:

  1. #include<iostream>
  2. using namespace std;
  3. bool g_InvaildPut=false;
  4. bool equal(double a,double b)
  5. {
  6. double c=a-b;
  7. if(c<0.000000001&&c>-0.00000001)
  8. {
  9. return true;
  10. }
  11. else
  12. return false;
  13. }
  14. double powerWithUnsignedExponent(double base, unsigned int exponent)
  15. {
  16. if(exponent==0)
  17. return 1.0;
  18. if(exponent==1)
  19. return base;
  20. double result=powerWithUnsignedExponent(base,exponent>>1);
  21. result*=result;
  22. if(exponent&1==1)
  23. result*=base;
  24. return result;
  25. }
  26.  
  27. double Power(double base,int exponent)
  28. {
  29. if(equal(base,0.0)&&exponent<0)
  30. {
  31. g_InvaildPut=true;
  32. return 0.0;
  33. }
  34. unsigned int absExponent=(unsigned int) exponent;
  35. if(exponent<0)
  36. absExponent=(unsigned int)(-exponent);
  37. double result=powerWithUnsignedExponent(base,absExponent);
  38. if(exponent<0)
  39. result=1.0/result;
  40. return result;
  41. }
  42. void main()
  43. {
  44. double p=Power(2,-7);
  45. cout<<p<<endl;
  46.  
  47. }

Java代码:

  1. public class BaseExponent {
  2. public boolean equal(double a,double b){
  3. double c=a-b;
  4. if(c>-0.00000001&&c<0.00000001)
  5. return true;
  6. else
  7. return false;
  8. }
  9. public double powerWithExponent(double a, int exponent){
  10. if(equal(a,0.0)&&exponent<0)
  11. return 0.0;
  12. if(exponent==0)
  13. return 1;
  14. if(exponent==1)
  15. return a;
  16. int absExponent=exponent;
  17. if(exponent<0)
  18. absExponent=-exponent;
  19. double result=powerWithExponent(a,absExponent>>1);
  20. result*=result;
  21. if((exponent&1)==1)
  22. result=result*a;
  23. if(exponent<0)
  24. result=1/result;
  25. return result;
  26. }
  27. public static void main(String[] args){
  28. BaseExponent be=new BaseExponent();
  29. double result=be.powerWithExponent(2,-3);
  30. System.out.println(result+" ");
  31. }
  32. }

剑指offer—第三章高质量代码(数值的整数次方)的更多相关文章

  1. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  2. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

  3. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  4. 《剑指offer》第十六题(数值的整数次方)

    // 面试题:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需要考 ...

  5. 剑指offer第三章

    剑指offer第三章 1.数值的整数次方 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. class Solution { public ...

  6. 剑指offer-第三章高质量代码(反转链表)

    题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转链表的头节点. 思路:对一个链表反转需要三个指针操作来保证链表在反转的过程中保证不断链,给链表一个行动指针pNode,对pNode指向的节 ...

  7. 剑指offer-第三章高质量代码(树的子结构)

    题目:输入两个二叉树A和B,判断B是不是A的子结构. 思路:遍历A树找到B树的根节点,然后再判断左右子树是否相同.不相同再往下找.重复改过程. 子结构的描述如下图所示: C++代码: #include ...

  8. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  9. 剑指offer第七章&第八章

    剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...

随机推荐

  1. hdu 4739 Zhuge Liang's Mines

    一个简单的搜索题,唉…… 当时脑子抽了,没做出来啊…… 代码如下: #include<iostream> #include<stdio.h> #include<algor ...

  2. redis命令参考

    http://doc.redisfans.com/ 进入redis命令行模式方式: 1.进入redis安装目录 2.运行redis-cli

  3. border-radius几种写法的原理剖析

    border-radius:40px; border-radius:40px/20px; border-radius:40px 20px; border-radius:40px 20px 10px 5 ...

  4. C/C++ 位域知识小结

    C/C++ 位域知识小结 几篇较全面的位域相关的文章: http://www.uplook.cn/blog/9/93362/ C/C++位域(Bit-fields)之我见 C中的位域与大小端问题 内存 ...

  5. Linux远程文件传输

    linux系统中,难免会遇到一些要将某文件通过网络传送给其他主机的情况,而恰好两台主机 都是linux系统的时候,我们就可以直接使用scp命令来传输文件到另一台主机了. scp命令用于在网络中安全的传 ...

  6. Sql server cast(as nvarchar) 默认长度问题

    Sql server 在我的SQL语句中:sql=".........cast(ziduan as nvarchar) ..............." 这样之后,ziduan被转 ...

  7. JQuery获取浏览器窗口的高度和宽度

    <script type="text/javascript"> $(document).ready(function() { alert($(window).heigh ...

  8. SGU 125 Shtirlits 搜索+可行性剪枝

    500ms时限406ms水过…… 直接枚举肯定超时,需要剪枝. 枚举每个格子的元素,检查其左上角和正上方格子是否满足条件,若不满足不必再向下搜索. 在 这里 看到一个更好的方法: 枚举每个格子是哪个相 ...

  9. 笔记一、Git服务器【转】

    传输协议: 本地传输,SSH协议,Git协议,HTTP协议   git clone /home/git/project.git                      // 本地clone git ...

  10. Entity Framework学习 - 4.Code First升级数据库

    1.在nuget控制台中执行:Enable-Migrations 2.将出现的configuation.cs文件中的AutomaticMigrationsEnabled属性改为true 3.在nuge ...