本篇实现的pow函数声明为
double MyPow(double m, int n);
接下来介绍两种实现pow函数的方法:
1、递归
以2^3为例,假设2^3比较难求,那么可以将2^3转换为2*2^2,这样只需要先求出2^2,同理,2^2又可以转换为2*2^1,而2^1也可以转换为2*2^0,假如幂次是负数,可以将其转换为正数求解。(ps:这里2^3表示2的3次方,不是按位异或)
/* * 函数名称:MyPow * * 函数功能:计算m的n次方(递归) * * 入口参数:m, n * * 出口参数:1.0 or m * MyPow(m, n - 1) or 1.0 / MyPow(m, -n) * * 返回类型:double */ double MyPow(double m, int n) { if (0 == n) { return 1.0; } else if (n > 0) { return m * MyPow(m, n - 1); } else { return 1.0 / MyPow(m, -n); } }
2、迭代
幂次自减作为循环条件,这里需要注意的是幂次为负数时,需要先将幂次转换为其相反数。
/* * 函数名称:MyPow * * 函数功能:计算m的n次方(迭代) * * 入口参数:m, n * * 出口参数:ret * * 返回类型:double */ double MyPow(double m, int n) { double ret = 1.0; if (0 == n) { ; } else if (n > 0) { while (n--) { ret *= m; } } else { int k = -n; while (k--) { ret /= m; } } return ret; }
3、主函数
#define _CRT_SECURE_NO_WARNINGS 1 /* * Copyright (c) 2018, code farmer from sust * All rights reserved. * * 文件名称:MyPow.c * 功能:求m的n次方 * * 当前版本:V1.0 * 作者:sustzc * 完成日期:2018年4月15日10:33:46 */ # include <stdio.h> # include <assert.h> # define EXP 0.000000000001 int main(void) { double num1 = 0; int num2 = 0; double ret = 0.0; printf("请输入两个数字:\n"); assert(2 == scanf("%lf%d", &num1, &num2)); if ((num1 < EXP) && (num1 > -EXP) && (0 == num2)) { printf("输入有误!该值无意义!\n"); } else { ret = MyPow(num1, num2); printf("%lf的%d次方是%lf\n", num1, num2, ret); } return 0; }
4、输出结果