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

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

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

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

三种错误处理方法:

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)返回。这个函数用到了一个公式如下:

#include<iostream>
using namespace std;
bool g_InvaildPut=false;
bool equal(double a,double b)
{
double c=a-b;
if(c<0.000000001&&c>-0.00000001)
{
return true;
}
else
return false;
}
double powerWithUnsignedExponent(double base, unsigned int exponent)
{
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result=powerWithUnsignedExponent(base,exponent>>1);
result*=result;
if(exponent&1==1)
result*=base;
return result;
} double Power(double base,int exponent)
{
if(equal(base,0.0)&&exponent<0)
{
g_InvaildPut=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;
}
void main()
{
double p=Power(2,-7);
cout<<p<<endl; }

Java代码:

public class BaseExponent {
public boolean equal(double a,double b){
double c=a-b;
if(c>-0.00000001&&c<0.00000001)
return true;
else
return false;
}
public double powerWithExponent(double a, int exponent){
if(equal(a,0.0)&&exponent<0)
return 0.0;
if(exponent==0)
return 1;
if(exponent==1)
return a;
int absExponent=exponent;
if(exponent<0)
absExponent=-exponent;
double result=powerWithExponent(a,absExponent>>1);
result*=result;
if((exponent&1)==1)
result=result*a;
if(exponent<0)
result=1/result;
return result;
}
public static void main(String[] args){
BaseExponent be=new BaseExponent();
double result=be.powerWithExponent(2,-3);
System.out.println(result+" ");
}
}

剑指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 1698 Just a Hook (线段树区间更新)

    题目链接 题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少. 思路 : 线段树的区间更新.可以理解为线段树成段更新的模板 ...

  2. WCF分布式开发步步为赢(10):请求应答(Request-Reply)、单向操作(One-Way)、回调操作(Call Back).

    WCF除了支持经典的请求应答(Request-Reply)模式外,还提供了什么操作调用模式,他们有什么不同以及我们如何在开发中使用这些操作调用模式.今天本节文章里会详细介绍.WCF分布式开发步步为赢( ...

  3. arcgis地图操作的资料URL,以供以后查阅

    更改Arcgis Web应用程序的端口号8399: http://help.arcgis.com/zh-cn/arcgisserver/10.0/help/arcgis_server_java_hel ...

  4. Codeforces Round #337 (Div. 2) C. Harmony Analysis 数学

    C. Harmony Analysis   The semester is already ending, so Danil made an effort and decided to visit a ...

  5. 基础DOM和CSS操作(二)

    元素样式操作 元素样式操作包括了直接设置CSS样式.增加CSS类别.类别切换.删除类别这几种操作方法.而在整个jQuery使用频率上来看,CSS样式的操作也是极高的,所以需要重点掌握. CSS操作方法 ...

  6. MySql经典语句

    1.三个函数: LENGTH  SUBSTR   LOCATE )) order by WebSiteShopUrl desc 2.序号 两种方法 第一种方法: ) ) as it 第二种方法: ; ...

  7. 【poj2891-Strange Way to Express Integers】拓展欧几里得-同余方程组

    http://poj.org/problem?id=2891 题意:与中国剩余定理不同,p%ai=bi,此处的ai(i=1 2 3 ……)是不一定互质的,所以要用到的是同余方程组,在网上看到有人称为拓 ...

  8. http和socket通信的区别

    应用层:HTTP协议(基于传输层的TCP协议,主要解决如何包装数据) 传输层: TCP协议(基于网络层的IP协议).TPC/IP协议(主要解决数据如何在网络中传输) 网络层: IP 协议 socket ...

  9. 【查找结构5】多路查找树/B~树/B+树

    在前面专题中讲的BST.AVL.RBT都是典型的二叉查找树结构,其查找的时间复杂度与树高相关.那么降低树高自然对查找效率是有所帮助的.另外还有一个比较实际的问题:就是大量数据存储中,实现查询这样一个实 ...

  10. MyBatis学习总结_09_使用MyBatis Generator自动创建代码

    一.构建一个环境 1. 首先创建一个表: CREATE TABLE t_user ( USER_ID INT NOT NULL AUTO_INCREMENT, USER_NAME CHAR(30) N ...