数值的整数次方

         即编写函数实现pow()函数的功能,求数值base的exponent次方。

         在不考虑指数为非正值的情况下,代码很简单:

#include <stdio.h>
double Power(double base, int exponent)
{
    double result = 1.0;
    for (int i = 1; i <= exponent; i++)
    {
	result *= base;
    }
    return result;
}
int main()
{
    double m;
    int n;
    printf("请输入底数m和指数n:");
    scanf("%lf %d", &m, &n);
    double result = Power(m, n);
    printf("%.2f的%d次方是%.2f\n", m, n, result);
    return 0;
}

         此代码只能处理exponent>0的情况,但是实际应用中多数情况下都是指数为小数的情况,很显然,这种思想不适用于所有的情况。

         改进:当指数是负数的时候,我们可以先对指数求绝对值,之后再对算出次方的结果取倒数。但是,如果结果为0,而0却没有倒数,这时候就要进行特殊处理了。

#include <stdio.h>
double Power(double base, int exponent)
{
    double result = 1.0;
    for (int i = 1; i <= exponent; i++)
    {
	result *= base;
    }
    return result;
}
int main()
{
    double m, result;
    int n;
    printf("请输入底数m和指数n:");
    scanf("%lf %d", &m, &n);
    if (m == 0.0)
    {
	printf("输入非法!\n");
    }
    if (n < 0)
    {
	n = -n;
	result = 1.0 / Power(m, n);
	printf("%.2f的%d次方是%f\n", m, -n, result);
    }
    else
    {
	result = Power(m, n);
        printf("%.2f的%d次方是%f\n", m, n, result);
    }
    return 0;
}

         以上代码可以匹配所有情况,但还是显得有点繁琐。我们假设要计算的指数为32,那么我们只需要在16次方的基础上再平方即可,而16次方就是8次方的平方……,这样以此类推,一个数的32次方只需要做5次乘法运算。即当n为偶数时,a^n = a^(n/2)*a^(n/2),当n为奇数时,a^n = a^((n-1)/2)*a^((n-1)/2)*a。于是改进后的代码为:

#include <stdio.h>
double Power(double base, int exponent)
{
    if (exponent == 0)
    {
	return 1;
    }
    if (exponent == 1)
    {
	return base;
    }
    double result = Power(base, exponent >> 1);
    result *= result;
    if (exponent & 0x1 == 1)
    {
	result *= base;
    }
    return result;
}
int main()
{
    double m, result;
    int n;
    printf("请输入底数m和指数n:");
    scanf("%lf %d", &m, &n);
    if (m == 0.0)
    {
    	printf("输入非法!\n");
    }
    else
    {
	if (n < 0)
	{
	    n = -n;
	    result = 1.0 / Power(m, n);
	    printf("%.2f的%d次方是%f\n", m, -n, result);
	}
	else
	{
	    result = Power(m, n);
	    printf("%.2f的%d次方是%f\n", m, n, result);
	}
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值