牛客网&剑指Offer&数值的整数次方

牛客网&剑指Offer&数值的整数次方在这里插入图片描述

另外,此题不需要考虑大数问题。
代码实现1

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

bool errinput = false;
bool Equal(double num1, double num2)
{
	if((num1 - num2 < 0.0000001) && (num1 - num2 > -0.0000001))
		return true;
	else
		return false;
}

class Solution {
public:
	double Power(double base, int exponent) {
		double result = 1.0;
		if (Equal(base,0.0) && exponent < 0)
		{ 			
			errinput = true;
			return 0;
		}
			
		if (exponent >= 0)
		{
			for (int i = 0; i < exponent; i++)
			{
				result = result * base;
			}
			return result;
		}
		else
		{
			for (int i = 0; i < -exponent; i++)
			{
				result = result * base;
			}
			return 1 / result;
		}
	}
};


int  main()
{
	double result = 0.0;
	double base_value = 0.0;
	int exponent_value = -3.0;
	Solution test;

	result = test.Power(base_value, exponent_value);
	cout << result << endl;
	cout << errinput << endl;

	return 0;
}

代码实现2

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

bool negativeflag = false;
bool errinput = false;

bool Equal(double num1, double num2)
{
	if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
		return true;
	else
		return false;
}

double PowerWithUnsignedExponent(double base,  int exponent)
{
	if (exponent == 0)
		return 1;
	if (exponent == 1)
		return base;

	if (exponent < 0)
	{	
		if (Equal(base, 0.0))
		{
			errinput = true;
			return 0;
		}
		else 
		{
			exponent = -exponent;
			negativeflag = true;
		}
	}
	double result = PowerWithUnsignedExponent(base, exponent >> 1);
	result *= result;
	if ((exponent & 0x1) == 1)
		result *= base;
	if(negativeflag == 0)
		return result;
	else
		return 1/result;
}

int  main()
{
	double result = 0.0;
	double base_value = 2.0;
	int exponent_value = -3;
	
	result = PowerWithUnsignedExponent(base_value, exponent_value);
	cout << result << endl;

	return 0;
}

编程笔记

  • 代码实现解题思路:根据题意列出算式即可,但是必须考虑多种情况。另外,还需要考虑分母不能为0的情况,当分母为0时,返回值为0,为了区分是出错返回0还是底数为0的时候正常运行返回的0,定义了一个全局变量。
  • 由于精度问题,不能用"=="判断两个小数是否相等,如果两个小数的差的绝对值很小,如小于0.0000001,就可以认为它们相等,如下面函数:
bool Equal(double num1, double num2)
{
	if((num1 - num2 < 0.0000001) && (num1 - num2 > -0.0000001))
		return true;
	else
		return false;
}
  • 可以用右移运算符代替整数除以2,用位与运算符代替求余运算符来判断一个数是奇数还是偶数,位运算的效率要比乘除法及求余运算符的效率高上很多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值