zoukankan      html  css  js  c++  java
  • 剑指offer—第三章高质量代码(数值的整数次方)

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

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

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

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

    三种错误处理方法:

    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+" ");
        }
    }
  • 相关阅读:
    python的类基础
    python导入模块
    python常用的内置函数
    python基础一数据类型之集合
    python函数-匿名函数
    python的函数(三)
    python的函数(二)
    python的函数(一)
    BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
    BZOJ4033:[HAOI2015]树上染色——题解
  • 原文地址:https://www.cnblogs.com/hupp/p/4523157.html
Copyright © 2011-2022 走看看