题:1s运行程序------double^int,统计2进制1的个数

所需知识
函数
循环
递归
位操作

  • 题目1:
  • 时间限制:1秒
  • 空间限制:32768K
  • 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方

❀思路分析
1.暴力循环法
码如其名,循环完成,每次乘以底数base,循环exponent次方

double Power(double base,int exponent)
{
	int sum = 0; //用来存放每次乘完base的值
	while(exponent--) //后置--,用完值后才减
	{
		sum *= base;
	}
	return sum;
}

×超时,不通过
2.暴力递归法

double Power(double base,int exponent)
{
	if(exponent == 0)
		return 1;
	else if(exponent == 1)
		return base;
	else
	{
		return base*Power(base,exponent-1);
	}
}	

×超时,不通过
3.?终极递归法(通过版)
拆分,依次计算

public:
    double Power(double base, int exponent) {
       if(exponent == 0)//如果指数为0,值恒为1,任何实数的0次方都为1
           return 1;
        else if(exponent >0)
        {
            if(exponent == 1)
                return base;
            else if(exponent%2 == 0)    //次数为2的倍数,进行拆分,例如(6.5)^4 = (6.5)^2*(6.5)^2
            {
                return Power(base,exponent/2)*Power(base,exponent/2);
            }
            else      //非2的倍数
            {
                return Power(base,exponent/2)*Power(base,exponent/2+1);
            }
        }
        else  //次数<0时,例如(6.5)^(-3) =1/(6.5)^3
        {
            return 1/Power(base,0-exponent);  //将其转化为exponent>0的情况
        }
    }
};
  • 题目2:
  • 时间限制:1秒
  • 空间限制:32768K
  • 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
    ❤位运算符法(通过版)
class Solution {
public:
     int  NumberOf1(int n) 
     {
         int count = 0;                  //十进制32位二进制数
         for(int i = 0; i<32; i++)   //负数在内存中的存储格式是补码,可直接运算
         {
             if( (n&1) == 1)    //&按位与运算符,n&1取出n中的2进制形式的最低位
                 count++;
             n = n>>1;          //每次判断完以后将字符串右移,将下一个要取的高位放在最低位上
         }
         return count;         //返回统计出的1的个数
     }
};

猜你喜欢

转载自blog.csdn.net/qq_24990383/article/details/83831593