zoukankan      html  css  js  c++  java
  • 数值的整数次方

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

    注意问题:
    1.判断参数:0的0次方非法,0的负数次方非法;
    2.当底数不为零,指数为正数时:循环相乘;
    3.当底数不为0,指数为负数时:先求指数的绝对值,在循环相乘,最后求倒数即可。

    详见下面代码Power函数:
    double  Power(double base,int exponent)
    {
        try
        {
            //0的负指数乘积不合法
            if(equals(base,0.0)&&exponent<0)
            {
                throw exception("参数不正确!");
            }
            unsigned int exp=(unsigned int)exponent;
            //如果指数是负数,则先转换n为正数,在计算a^n,最后求倒数
            if(exponent<0)
                exp=(unsigned int)(-exponent);
            //求base^exp,exp为正整数
            double result=GetPower(base,exp);
            //如果指数为负数则求倒数
            if(exponent<0)
                result=1/result;
            return result;
        }
        catch(exception e)
        {
            cerr<<e.what()<<endl;
        }
    }
    //a^n的实现
    double GetPower(double base,double exp)
    {
        double result=1.0;
        for(int i=0;i<exp;i++)
            result*=base;
        return result;
    }
    //判断两个double变量是否相等
    bool equals(double number1,double number2)
    {
        if(number1-number2>-0.00000001&&number1-number2<0.0000001)
            return true;
        else
            return false;
    }

    还有一种方法求a的n次方:

    利用公式:a^n=

    {

    a^(n/2)*a^(n/2)   n为偶数;

    a^[(n-1)/2] *a^[(n-1)/2]*a  n为奇数;

    }

    详见下面代码中的Power2函数:
    //递归实现
    double Power2(double base,int exponent)
    {
        try
        {
            //0的负指数乘积不合法
            if(equals(base,0.0)&&exponent<=0)
            {
                throw exception("参数不正确!");
            }
            //递归返回条件
            if(exponent==0)
                return 1;
            if(exponent==1)
                return base;
            if(exponent==-1)
                return 1/base;
            double result=Power2(base,exponent>>1);//递归计算n/2次方
            result*=result;//base的exponent次方=(base的exponent/2次方)*(base的exponent/2次方)
            if(exponent&1==1)//指数为奇数时
                result*=base;//base的exponent次方=(base的exponent/2次方)*(base的exponent/2次方)*base
            return result;
        }
        catch(exception e)
        {
            cerr<<e.what()<<endl;
        }
    }
    
    

    测试代码及结果:

    int main()
    { 
        cout<<"使用第一种方法:"<<endl;
        cout<<"2^3="<<Power(2,3)<<endl;
        cout<<"0^-3="<<Power(0,-3)<<endl;
        cout<<"2^-3="<<Power(2,-3)<<endl;
        cout<<"使用第二种方法:"<<endl;
        cout<<"-2^3="<<Power2(-2,3)<<endl;
        cout<<"-2^-3="<<Power2(-2,-3)<<endl;
        return 0;
    }

     
  • 相关阅读:
    HDU 4725 The Shortest Path in Nya Graph(优先队列+dijkstra)
    POJ 3216 Repairing Company(二分图匹配)
    POJ 3414 Pots(bfs打印路径)
    POJ 3278 Catch That Cow(bfs)
    poj 3009 curling2.0 (dfs)
    用“道”的思想解决费用流问题---取/不取皆是取 (有下界->有上界) / ACdreamoj 1171
    hdu2448 / 费用流 / harbin赛区c题
    大数类模板(+-*/%等等)
    hdu4619 / 最大独立集
    hdu4888 多校B 最大流以及最大流唯一判断+输出方案
  • 原文地址:https://www.cnblogs.com/runninglzw/p/4500472.html
Copyright © 2011-2022 走看看