zoukankan      html  css  js  c++  java
  • 实数的整数次方(考虑了优化效率做法)

    //添加全局变量以便考虑次方是否出错
    bool InvaildInput = false;
    
    //判断数值是否相等,实数需要相关判断。。。
    bool EqualD(const double& num1, const double& num2)
    {
        return fabs(num1 - num2) > 1E-6 ? false : true;
    }
    
    //求取实数的正次方
    double PowerD_UINT(const double& base, unsigned int exponent)
    {
        //普通做法
        //double res = 1.0;
        //for (size_t i = 0; i < exponent; i++)
        //{
        //    res *= base;
        //}
    
        //递归的
        if (0 == exponent)
            return 1.0;
        if (1 == exponent)
            return base;
    
        double res = PowerD_UINT(base, exponent >> 1);
        res *= res; //求平方
        if (1 == exponent & 0x01) //判断exponent是否为偶数
            res *= base;
    
        return base;
    }
    
    //求取实数的整数次方
    double PowerD(double base, int exponent)
    {    
        InvaildInput = false;
    
        //0的正次方以及负次方都定义为0.0
        if (EqualD(base, 0))
        {
            if (exponent < 0)
            {
                InvaildInput = false;
                return 0.0;
            }
            else
            {
                return 0.0;
            }
        }
    
        if (0 == exponent)
        {
            return 1.0;
        }
        if (EqualD(base,1.0))
        {
            return 1.0;
        }
    
        //0次方在初始位置已经解决
        double res = 0.0;
        unsigned uint_exponent;
        if (exponent<0)
        {
            //注意不能直接unsigned int(exponent)
            //unsigned short(-1)=65535...
            uint_exponent = unsigned int(-exponent);
            res = PowerD_UINT(base, uint_exponent);
            res = 1.0 / res;
        }
        else
        {
            uint_exponent = unsigned int(exponent);
            res = PowerD_UINT(base, uint_exponent);
            res = 1.0 / res;
        }
    
        return res;
    }

    最后的递归简直不能再赞了,学到了!

    这里针对整数》1的递归次数应该在合理的范围内,不会造成栈溢出。

    unsigned int x = UINT_MAX,n=0;
    for (x; x >= 1; x = x >> 1)
    {
        cout << ++n << endl;
    }

    结果为32次!

  • 相关阅读:
    linux & centos命令
    javascript总结
    SocanCode7之模板编写
    SocanCode连接Oracle的方法
    ashx的使用
    SocanCode代码生成器版本更新记录 [SocanCode7全新发布]
    IIS7.0中使用MVC3,静态页正常,其它404
    不用再纠结反射影响效率了
    ASP.NET MVC 框架处理请求生命周期
    create xmlhttprequest
  • 原文地址:https://www.cnblogs.com/jason1990/p/4704809.html
Copyright © 2011-2022 走看看