zoukankan      html  css  js  c++  java
  • 求一个数的整数次方

    题目:求一个数的整数次方。

    题目是如此的简单,但是需要考虑的还是比较多:

    1.指数为负,底数是零;

    2.指数底数都是零;

    3.返回正常零和返回错误零的区别;

    4.底数为正,指数为负如何处理;

    5.考虑底数次方大的话,想效率问题;

    6.处理double数值相等问题;

    以下直接是代码,详细考虑除底数指数全零的以上所有情况!

    #pragma once
    
    /*
    *base是底数 exponent是指数
    */
    bool g_Input = false;                     //错误时,返回零,和正常返回零区别
    
    double Power(double base, int exponent)
    {
    	g_Input = false;
    
    	if (equal(base, 0.0) && exponent < 0) //底数为零,指数为负,即考虑分母为零
    	{
    		g_Input = true;
    		return 0.0;
    	}
    
    	unsigned int absExponent = (unsigned int)(exponent);
    	if (exponent < 0)        //如果指数为负,先换成正的处理
    		absExponent = (unsigned int)(-exponent);
    
    	double result = PowerWithUnsingnedExponent(base, absExponent);  //最终结果
    	if (exponent < 0)        //如果指数为负,结果就是正数的倒数
    		result = 1.0 / result;
    
    	return result;
    }
    
    //将一个数的次方拆分,2为拆分单元 提高效率
    double PowerWithUnsingnedExponent(double base, unsigned int exponent)
    {
    	if (exponent == 0)    //两个递归出口
    		return 1;
    	if (exponent == 1)
    		return base;
    
    	double result = PowerWithUnsingnedExponent(base,exponent>>1); //右移1 表示 除2
    	result *= result;
    	if (exponent & 0x1 == 1)   //判断奇数偶数
    		result *= base;
    
    	return result;
    }
    
    //两个double数是否相等,不能用绝对的相等来写,两个double数满足如下,就判相等
    bool equal(double num1, double num2)
    {
    	if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
    		return true;
    	else
    		return false;
    }
    
    void Test()
    {
    	//PowerWithUnsingnedExponent(2,3);
    	Power(2,3);
    
    }
    赐教!

  • 相关阅读:
    NOP源码分析六--实体、数据的分层与处理。
    NOP源码分析七---继续
    NOP源码分析 八---set的存储
    Nop 源码分析四 任务系统
    NOP源码分析五,文件位置等详细内容,感冒真难受,嗓子痒又疼。。
    1
    mobx
    ts随笔
    13.vue-vuex
    13.vue-axios
  • 原文地址:https://www.cnblogs.com/melons/p/5791814.html
Copyright © 2011-2022 走看看