【C】库函数之pow

  本篇实现的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、输出结果







猜你喜欢

转载自blog.csdn.net/sustzc/article/details/80083450
今日推荐