11--数值的整数次方


/*
题目:数值的整数次方。
    实现:double Power(double base, int exponet);
    求base的exponet次方。不得使用库函数,同时不需要考虑大数问题。
    
解题思路:
    注意两个问题:
        (1):计算机中的float和double是有偏差的,一般 1.0 != 1.0.所以如果想计算就要写 abs(a - b) < 0.000001 就可以。
        (2):要考虑边界条件:(a),底数是0或者1,次方是负数。

优化:
    这里求a的b次方是可以优化的。
    举例:10的20次方。就等于10的10次方 乘以 10的10次方。
    可以减少一半的计算量。
    并且分奇数和偶数。用位操作。超过了除法的速度。

*/


#include <stdio.h>

//判断两个数值是否相等
int equal(double base, int number)
{
    if ((base - number > 0 && base - number < 0.0000001) || (base - number < 0 && base - number > -0.0000001))
        return 1;
    else
        return 0;

}

double countNumPower(double base, int num)
{
    printf("%d , %f\n",num, base);
    double result = 1.0;
    for (int i = 1; i <= num; i++)
        result *= base;

    return result; 
}


//优化的计算次方。
double fastPowerCount(double base, int num)
{
    if (exponet == 0)
        return 1;
    if (exponet == 1)
        return base;

    //这里右移一位,比/2快。
    double result = fastPowerCount(base, num >> 1);
    result *= result;
    if (exponet & 0x1 == 1)        //这里判断最后一个是否是1,也就是奇数。
        result *= base;

    return result;

}



//次方
double Power(double base, int exponet)
{
    if (equal(base, 0.0) && exponet < 0)
    {
        printf("输入错误:base 等于0,并且整数次方小于0.\n");
        return -1.0;
    }

    //认为任何数值的0次方都是1
    if (exponet == 0)
        return 1.0;

    // 当是基数是0或者1的时候,就是返回当前值。认为他们的任何次方都是其本身。
    if (equal(base, 0.0) || equal(base, 1.0))
    {
        printf("base %f\n", base);
        return base;
    }

    if (exponet > 0) 
    {

        return countNumPower(base, exponet);
    }
    else if (exponet < 0)        //如果次方数是负数,就取倒数。
    {

        return 1.0/countNumPower(base, -exponet);
    }
    
}


//测试程序
void test(double base, int exponet)
{
    printf("%f\n", Power(base, exponet));
}

int main()
{
    test(0.0, 1);
    test(1.0, 1);
    test(2, 1);
    test(3, 3);
    test(4, 3);
    test(1.5, 3);
    test(0.5, 3);
    test(10, -2);



    return 0;

}

优质内容筛选与推荐>>
1、Cview的派生类
2、强大的报表前端展现功能
3、Linux -- VMWare虚拟机常见的网络类型
4、使用 Fiddler 对android模器进行Http监控(转)
5、语言基础


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号