标签:
/* 题目:数值的整数次方。 实现: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; }
标签:
原文地址:http://www.cnblogs.com/hgonlywj/p/4842553.html