您的位置:首页 > 其它

11--数值的整数次方

2015-09-27 19:01 357 查看
/*
题目:数值的整数次方。
实现: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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: